gpt4 book ai didi

sql - Postgresql 在月份范围之间进行选择

转载 作者:行者123 更新时间:2023-11-29 11:20:23 24 4
gpt4 key购买 nike

我有一个表格,其中一列的日期格式为“YYYY-MM-DD”。我可以使用 select 获取每月范围内的所有数据吗?假设我想要从 2012-01-xx 到 2013-04-xx 的所有数据。所以我基本上是在寻找如下所示的 SQL 查询:

SELECT * FROM table WHERE date IN BETWEEN '2012-01' AND '2013-04' (INVALID QUERY)

由于每个月都以“01”开头,我可以修改上述查询以调整开始条件。

SELECT * FROM table WHERE date IN BETWEEN '2012-01-01' AND '2013-04' (INVALID QUERY)

现在问题与结束日期有关。我必须手动计算给定月份的最后日期,考虑所有因素,如月份长度、闰年等,因为如果给定日期无效,查询将失败。所以目前我正在做这样的事情:

SELECT * FROM table WHERE date IN BETWEEN '2012-01-01' AND 'VALID_MONTH_END_DATE' (VALID Query)

我想知道是否有任何方法可以避免这种有效的结束日期计算?

澄清

我已经考虑过下个月的第一天,但​​即使那样我也必须应用一些逻辑说,如果是 12 月,下个月将是明年的 1 月。我想知道仅 SQL 解决方案是否可行?

最佳答案

最好避免BETWEEN用于日期范围比较。更好用>=<因为它同样适用于日期和日期时间列/值。

一种方式(如果您可以在外部构建日期):

WHERE date >= DATE '2012-01-01' 
AND date < DATE '2013-05-01' --- first date of the next month

您还可以使用日期算法:

WHERE date >= DATE '2012-01-01' 
AND date < DATE ('2013-04-01' + INTERVAL '1 MONTH')

OVERLAPS运算符(operator):

WHERE (date, date) OVERLAPS
(DATE '2012-01-01', DATE '2013-05-01')

您还应该阅读 Postgres 文档:Date/Time Functions and Operators

manual explains here为什么 OVERLAPS以这种方式工作:

Each time period is considered to represent the half-open interval start <= time < end, unless start and end are equal in which case it represents that single time instant. This means for instance that two time periods with only an endpoint in common do not overlap.

关于sql - Postgresql 在月份范围之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11286592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com