Amazon web services 亚马逊红移日期计算问题/错误

Amazon web services 亚马逊红移日期计算问题/错误,amazon-web-services,amazon-redshift,Amazon Web Services,Amazon Redshift,专家可以告诉你为什么红移会做这个错误的计算。 如果我回溯到2017年11月1日之前的前一天,我应该得到10月31日的输出,但它返回到10月30日。这是一个错误吗 select dateadd(month, -6, dateadd(day, -2, date('20180503')) ) AS "this is 1nov17", dateadd(month, -6,

专家可以告诉你为什么红移会做这个错误的计算。 如果我回溯到2017年11月1日之前的前一天,我应该得到10月31日的输出,但它返回到10月30日。这是一个错误吗

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

它的行为完全正确

这:

是这样说的:“给我一个日期,它比2018-05-03之前3天的日期早6个月。”

2018-05-03<代码>之前3天的日期是<代码>2018-04-30<代码>

2018年4月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
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