繁体   English   中英

postgresql:时间存储为文本。 如何查询时间

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM