postgresql:以文本形式存储的时间,如何查询时间

cgvd09ve  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(3)|浏览(167)

我有一个名为device的表,它具有以下数据类型

device table:

column        Type
id            integer
created       text
name          text

此处时间存储为text类型,而不是timestamp
例如:created12/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

这结果是不是按照每日期时间顺序.它可能是比较一些文本字符串.
那么,在这种情况下,即使数据以文本形式存储,获取数据的最佳解决方案是什么

tjvv9vkg

tjvv9vkg1#

这是因为字符串是按字典顺序比较的,使用to_timestamp和格式说明字符串将文本转换为时间戳,然后比较时间戳。
如果您根据ISO-8601化日期-时间字符串,那么您可以将它们直接转换为timestamp。
除非这是您无法控制的(外来?)表,否则 * 不要 * 将时间戳存储为格式化文本。

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;

顺便说一句,你不需要引用。

vsikbqxv

vsikbqxv2#

你需要把文本转换成时间戳。在这种情况下,简单的转换就足够了。

SELECT device.id,
       device.created,
       device.name,
FROM device
WHERE device.created::timestamp < '12/19/2020 20:40:23'
LIMIT 21
mefy6pfw

mefy6pfw3#

在这种情况下,最好的解决方案是使用ALTER TABLE语句将created列从文本转换为时间戳。这将允许您在查询表时使用正确的日期和时间函数及运算符,从而确保结果按正确的顺序排序。
例如,可以使用以下SQL语句将created列转换为时间戳:

ALTER TABLE device
ALTER COLUMN created SET DATA TYPE TIMESTAMP USING 
to_timestamp(created, 'MM/DD/YYYY HH24:MI:SS');

此语句使用to_timestamp函数将created列中的文本值转换为使用MM/DD/YYYY HH24:MI:SS的时间戳,该格式与文本日期的格式相匹配。
完成此更改后,现在可以使用适当的日期和时间函数及运算符查询表,如下所示:

SELECT "device"."id",
       "device"."created",
       "device"."name",
FROM "device"
WHERE "device"."created" < '12/19/2020 20:40:23'::timestamp
ORDER BY created
LIMIT 21

相关问题