我是一名SQL开发人员,大部分时间都花在MSSQL上。 我正在寻找一种更好的方法来过滤PostgreSQL数据库中的“Timestamp without timezone”字段。
我正在使用:
Where
DateField >= '2010-01-01' and
DateField < '2012-01-01'
但鉴于我不是语法方面的专家,我必须认为有更好的方法。
有什么建议吗?感谢。
答案 0 :(得分:28)
你的解决方案很好。如果日期是文字,我更喜欢,但是:
WHERE datefield >= '2010-01-01 00:00:00'
AND datefield < '2012-01-01 00:00:00'
这执行完全相同,但更可维护,因为它清楚地表明每个文字“日期”的点是时间戳,而不是日期。例如,假设有人将您的查询更改为以下
AND datefield <= '2012-01-01'
...期待(并且失败)在查询中包含整天“2012-01-01”。使用后面的语法,意图更清晰,这种混乱被阻止了。
为了使它更清晰(也许太冗长),你可以进行显式演员:
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp
我不会因为类似的原因(潜在的数据类型混淆)而使用to_date()
,也不会to_timestamp()
(它会返回timestamptz
)。
BTW,我修改了案例以符合推荐的做法(大写的关键字,小写的标识符)
答案 1 :(得分:4)
对于日期间隔,您可以使用以下内容:
WHERE DateField BETWEEN to_date('2010-01-01','YYYY-MM-DD')
AND to_date('2010-01-02','YYYY-MM-DD')
它更短(您不需要重复DateField
),并且具有明确的日期格式。
1小时/天/月/年您可以使用:
WHERE date_trunc('day',DateField) = to_date('2010-01-01','YYYY-MM-DD')
答案 2 :(得分:0)
只要您的列名的类型为BETWEEN
并且列名不是“ timestamp”,您就可以使用TIMESTAMP
来简化查询。
SELECT * FROM table WHERE column BETWEEN '2018-12-30 02:19:34' AND '2018-12-30 02:25:34'
这适用于日期“ 2018-12-30”和日期时间“ 2018-12-30 02:19:34”。