2016-08-18 320 views
0

我有一个PSQL数据库,在表中有“start_time”和“end_time”字段。PostgreSQL日期范围查询

这些从json文件以字符串形式导入到数据库中的文本字段。该字符串具有以下格式:yyyy-mm-dd hh:mm:ss 我想要执行一个查询来给出数据库中某个表在给定日期范围内的所有ID。

要做到这一点,我可以做两件事之一。我可以查询给定日期范围的开始时间和结束时间的列表,并且从该查询返回查询我正在查找的实际数据WHERE start_time = ANY ('{list of dates go here}')

另一个选项是计算出如何将行的格式更改为可比较的内容。如果字段不是文本字段,则类似WHERE start_time > beginning of date range AND end_time > end of date range

日期范围将来自网站的日期时间选择器。

这可能是一个重复的帖子,但经过几小时的搜索解决方案后,没有出现任何内容。所以任何正确的方向都是有帮助的。

感谢

+0

我想我不知道你的问题是什么,在这里。你问是否将时间戳存储为时间戳或文本更好?或者你问如何将文本时间戳转换为时间戳时间戳? – jmelesky

+0

请勿为不相关的事物添加标签。这是Postgres,而不是MySQL。 – tadman

+0

添加了标签和背景信息,以防日期在放入查询之前或之后有更好的解决方案来处理服务器端在python中的信息或在javascript中的客户端上的信息。然而,postgres是魔术,鲍里斯的答案正是我正在寻找的。 –

回答

1

PostgreSQL的应该去容易对你在这种情况下。只需将字符串转换为时间戳和比较即可。

这应该工作开箱:

WHERE start_time::timestamp > '2016-01-01' AND end_time::timestamp < '2016-12-31' 
+0

公平答案。只是两个更正。 1.第二次比较应该是'<' not '>'。 2.对于在大数据集上的性能,您可能需要在这些文本字段上使用表达式索引。'CREATE INDEX mytable_start_time_idx ON mytable(start_time :: timestamp);' 'CREATE INDEX mytable_end_time_idx ON mytable(end_time :: timestamp);' – filiprem

+0

你说的全部都是真的。索引是正确的路要走,是的,我从问题本身复制了查询,保留了错误:) –

+0

您的答案中有一个错误。时间戳<日期比较。我们必须意识到'2016-12-31 23:55:00'不会比'2016-12-31'更少。因此,您的查询不会包含晚于“2016-12-31 00:00:00”的任何内容。右侧应该是'end_time :: timestamp <='2016-12-31 23:59:59.999''或者更好 - 'end_time :: date <='2016-12-31''(这样更简单) 。 – filiprem