如何查询检查一个月是否在两个日期之间?

时间:2019-06-26 08:14:36

标签: sql postgresql

我正在寻找Postgresql中的查询,以检查一个月是否在两个日期之间。

我知道如何检查日期是否在两个日期之间。 Postgres也具有执行此操作的功能。

假设我有一个带有行的a_table:

import pandas as pd

my_list = [42, 50, 52, 59, 60, 62] 

df = pd.read_csv('/Users/uni/Desktop/corrindex+id/rt35',
                 index_col= False,
                 header=None,
                 nrows=max(my_list) + 1).iloc[mylist]

我有一个返回行,其中包含在start_date和end_date之间的月份。 假设我有一个2019-08个月。 所以当我数数

ID | start_date (timestamp)  | end_date (timestamp)
1  | 2019-07-20 00:00        | 2020-03-20 00:00
2  | 2019-08-20 00:00        | 2020-08-30 00:00

它返回2行,ID 1和ID 2

并且当我有一个2020-01月份时,它仅返回ID 1

3 个答案:

答案 0 :(得分:1)

您可以使用date range

我不清楚如果表中的开始/结束日期仅涵盖一个月的一部分,应该怎么办。

如果您只想考虑整个月,请使用“包含”运算符

select count(*)
from the_table
where daterange(start_date::date, end_date::date, '[]') @> daterange('2019-08-01'::date, '2019-09-01'::date, '[)');

<@是“包含”运算符,用于测试左侧范围(表中的值)是否包含在右侧范围(要测试的月份)中。比较是通过“打开间隔”完成的,这意味着'2019-09-01'被排除在其中。上面将不考虑不包含整个八月的行。

如果您还想包括部分匹配项,请改用“重叠”运算符&&

select count(*)
from the_table
where daterange(start_date::date, end_date::date, '[]') && daterange('2019-08-01'::date, '2019-09-01'::date, '[)');

答案 1 :(得分:0)

您可以在where子句中使用to_date()。这样您的where子句将像这样。

WHERE '2019-08' BETWEEN to_date(start_date, 'YYYY-MM') and to_date(end_date ,'YYYY-MM')

答案 2 :(得分:0)

我建议将其写为:

WHERE end_date >= TO_DATE('2019-08', 'YYYY-MM') AND
      start_date < TO_DATE('2019-08', 'YYYY-MM') + INTERVAL '1 MONTH'

也就是说,该期间至少包括一个月的一天,因为它在月底之前开始,并在月初之后结束。

此外,此表的列上没有任何功能。因此,如果任一列上都有索引,则可以使用它。如果将开始/结束定义为范围,则将提供使用索引的其他机会。