Amazon 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

它的行为完全正确。

这:

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

最新更新