我在postgres中有两个日期列:'StartDate'和'EndDate'。 我需要使用不同的代码分配日期范围的各种组合。 例如 IF StartDate = EndDate那么'a'
我希望能够做的是选择任何行,其中StartDate是任何月份的第一天,EndDate是任何月份的最后一天。 (IF StartDate = FirstDayOfMonth AND EndDate = LastDayOfMonth那么'b')。
e.g。当StartDate = '01 -02-2011'并且EndDate = '31 -05'2012'然后'b',或者StartDate = '01 -11-1996'和EndDate = '31 -01-2001'然后'b'。
答案 0 :(得分:3)
最容易获得一个月的第一天和最后一天是依靠日期算术,例如:
# select date_trunc('month', now()::date);
date_trunc
------------------------
2014-12-01 00:00:00+01
(1 row)
# select date_trunc('month', now()::date)
+ interval '1 month'
- interval '1 day';
?column?
------------------------
2014-12-31 00:00:00+01
(1 row)
如果需要,请注意您可以使用generate_series()
计算两个日期之间的完整列表:
select d as first_day,
d + interval '1 month' - interval '1 day' as last_day
from generate_series('2014-01-01'::date,
'2014-12-01'::date,
'1 month') as d;
first_day | last_day
------------------------+------------------------
2014-01-01 00:00:00+01 | 2014-01-31 00:00:00+01
2014-02-01 00:00:00+01 | 2014-02-28 00:00:00+01
2014-03-01 00:00:00+01 | 2014-03-31 00:00:00+02
2014-04-01 00:00:00+02 | 2014-04-30 00:00:00+02
2014-05-01 00:00:00+02 | 2014-05-31 00:00:00+02
2014-06-01 00:00:00+02 | 2014-06-30 00:00:00+02
2014-07-01 00:00:00+02 | 2014-07-31 00:00:00+02
2014-08-01 00:00:00+02 | 2014-08-31 00:00:00+02
2014-09-01 00:00:00+02 | 2014-09-30 00:00:00+02
2014-10-01 00:00:00+02 | 2014-10-31 00:00:00+01
2014-11-01 00:00:00+01 | 2014-11-30 00:00:00+01
2014-12-01 00:00:00+01 | 2014-12-31 00:00:00+01
(12 rows)
答案 1 :(得分:0)
您可以提取日期的day
部分并检查其值。对于该月的第一天,它应该是1,而对于最后一天 - 您只需在该日期添加一天并检查它是否是下个月的第一天,这将意味着原始日期是最后一天当月。
...
CASE WHEN
EXTRACT('day' FROM StartDate) = 1
AND
EXTRACT('day' FROM EndDate + '1 day'::interval) = 1
THEN 'b'
...