[英]postgresql: time stored as text. how to query with respect to time
我有一个名为 device 的表,具有以下数据类型
device table:
column Type
id integer
created text
name text
这里时间以text
类型存储而不是timestamp
例如: created
价值12/19/2020 20:40:23
我尝试使用此日期时间进行查询。
SELECT "device"."id",
"device"."created",
"device"."name",
FROM "device"
WHERE "device"."created" < '12/19/2020 20:40:23'
LIMIT 21
结果不是按照日期时间顺序。 它可能正在比较一些文本字符串。
那么在这种情况下获取数据 w.r.t 时间的最佳解决方案是什么,尽管它存储为文本
那是因为字符串是按字典顺序比较的。 使用带有格式规范字符串的to_timestamp
将文本转换为时间戳,然后比较时间戳。
如果您根据ISO-8601格式化日期时间字符串,则可以将它们直接转换为时间戳。
除非这是您无法控制的(外国?)表,否则不要将时间戳存储为格式化文本。
SELECT id, created, name
FROM device
WHERE to_timestamp(created, 'mm/dd/yyyy hh24:mi:ss') < '2020-12-19 20:40:23'::timestamp
LIMIT 21;
顺便说一句,您不需要引用。
您需要将文本转换为时间戳。 在这种情况下,一个简单的转换就足够了。
SELECT device.id,
device.created,
device.name,
FROM device
WHERE device.created::timestamp < '12/19/2020 20:40:23'
LIMIT 21
在这种情况下,最好的解决方案是使用 ALTER TABLE 语句将“创建的”列从文本转换为时间戳。 这将允许您在查询表时使用正确的日期和时间函数和运算符,确保结果以正确的顺序排序。
例如,您可以使用以下 SQL 语句将“created”列转换为时间戳:
ALTER TABLE device ALTER COLUMN created SET DATA TYPE TIMESTAMP USING to_timestamp(created, 'MM/DD/YYYY HH24:MI:SS');
此语句使用“to_timestamp”function 将“创建”列中的文本值转换为使用与文本日期格式匹配的格式“MM/DD/YYYY HH24:MI:SS”的时间戳。
进行此更改后,您现在可以使用适当的日期和时间函数和运算符查询表,如下所示:
SELECT "device"."id", "device"."created", "device"."name", FROM "device" WHERE "device"."created" < '12/19/2020 20:40:23' ::时间戳 ORDER BY 创建 LIMIT 21
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.