Rob*_*b S 13 postgresql date-range
我是一名SQL开发人员,大部分时间都在MSSQL上度过.我正在寻找一种更好的方法来过滤PostgreSQL数据库中的"Timestamp without timezone"字段.
我正在使用:
Where
DateField >= '2010-01-01' and
DateField < '2012-01-01'
Run Code Online (Sandbox Code Playgroud)
但鉴于我不是语法方面的专家,我必须认为有更好的方法.
有什么建议?谢谢.
leo*_*loy 31
你的解决方案很好.如果日期是文字,我宁愿,但是:
WHERE datefield >= '2010-01-01 00:00:00'
AND datefield < '2012-01-01 00:00:00'
Run Code Online (Sandbox Code Playgroud)
这执行完全相同,但更可维护,因为它清楚地表明每个文字"日期"的点是时间戳,而不是日期.例如,假设有人将您的查询更改为以下内容
AND datefield <= '2012-01-01'
Run Code Online (Sandbox Code Playgroud)
...期待(并且失败)在查询中包括整天"2012-01-01".使用后面的语法,意图更清晰,并且防止了这种混淆.
为了使它更清晰(也许太冗长),你可以进行显式转换:
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp
Run Code Online (Sandbox Code Playgroud)
我不会to_date()在这里使用类似的原因(潜在的数据类型混淆),也不会to_timestamp()(它返回一个timestamptz).
顺便说一句,我修改了案例以符合推荐的做法(大写的关键字,小写的标识符)
Igo*_*nko 11
对于日期间隔,您可以使用以下内容:
WHERE DateField BETWEEN to_date('2010-01-01','YYYY-MM-DD')
AND to_date('2010-01-02','YYYY-MM-DD')
Run Code Online (Sandbox Code Playgroud)
它更短(您不需要重复DateField),并且具有明确的日期格式。
对于 1 小时/天/月/年,您可以使用:
WHERE date_trunc('day',DateField) = to_date('2010-01-01','YYYY-MM-DD')
Run Code Online (Sandbox Code Playgroud)
我同意 leonbloy 的观点,使用它将使代码更具可读性和清晰性。
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp
Run Code Online (Sandbox Code Playgroud)
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”。
| 归档时间: |
|
| 查看次数: |
47013 次 |
| 最近记录: |