我正在寻找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
答案 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'
也就是说,该期间至少包括一个月的一天,因为它在月底之前开始,并在月初之后结束。
此外,此表的列上没有任何功能。因此,如果任一列上都有索引,则可以使用它。如果将开始/结束定义为范围,则将提供使用索引的其他机会。