专家可以告诉你为什么redshift正在做错误的计算。 如果我在1nov17之前回溯并前往前一天,我应该得到31-oct的输出,但它返回30-oct。这是一个错误??
select
dateadd(month,
-6,
dateadd(day, -2, date('20180503'))
) AS "this is 1nov17",
dateadd(month,
-6,
dateadd(day, -3, date('20180503'))
) AS "should be 31oct17"
输出结果为:
this is 1nov17 should be 31oct17
2017-11-01 00:00:00.0 2017-10-30 00:00:00.0
答案 0 :(得分:1)
表现得非常正确。
此:
dateadd(month,
-6,
dateadd(day, -3, date('20180503'))
) AS "should be 31oct17"
说:"给我的日期是在2018-05-03之前的3天之前的6个月"。
2018-05-03
之前3天的日期为2018-04-30
2018-04-30
之前6个月的日期为2017-10-30
相反,如果你颠倒了两个操作:
2018-05-03
之前6个月的日期为2018-11-03
2018-11-03
前3天的日期2018-10-31
(一天后)因此,问题是由于有几个月有30天而其他月有31天。
您可能希望" 该月的最后一天"。这对我们人类来说总是困难和混乱,最好避免。如果你真的需要它,那么从下个月的第一天减去一天是最简单的:
SELECT
dt,
(dt + '1 month'::interval - '1 day'::interval)::date
FROM (SELECT ('2018-01-01'::date + '1 month'::interval * generate_series(0,11))::date as dt)
返回:
2018-01-01 2018-01-31
2018-02-01 2018-02-28
2018-03-01 2018-03-31
2018-04-01 2018-04-30
2018-05-01 2018-05-31
2018-06-01 2018-06-30
2018-07-01 2018-07-31
2018-08-01 2018-08-31
2018-09-01 2018-09-30
2018-10-01 2018-10-31
2018-11-01 2018-11-30
2018-12-01 2018-12-31