我是一名 SQL 开发人员,大部分时间都花在 MSSQL 上。我正在寻找一种更好的方法来过滤 PostgreSQL 数据库中的“没有时区的时间戳”字段。
我正在使用:
Where
DateField >= '2010-01-01' and
DateField < '2012-01-01'
但鉴于我不是语法专家,我不得不认为有更好的方法。
有什么建议么?谢谢。
我是一名 SQL 开发人员,大部分时间都花在 MSSQL 上。我正在寻找一种更好的方法来过滤 PostgreSQL 数据库中的“没有时区的时间戳”字段。
我正在使用:
Where
DateField >= '2010-01-01' and
DateField < '2012-01-01'
但鉴于我不是语法专家,我不得不认为有更好的方法。
有什么建议么?谢谢。
你的解决方案很好。如果日期是文字,我更喜欢:
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()
(它返回 a timestamptz
)。
顺便说一句,我已经修改了案例以符合推荐的做法(大写的关键字,小写的标识符)
对于日期间隔,您可以使用以下内容:
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')
BETWEEN
只要您的列名是类型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”。
我同意 leonbloy 的观点,即使用它会使代码更具可读性和清晰性。
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp