【问题标题】:SQL Server : DATEADD 29 February not return 30,31 JanuarySQL Server:DATEADD 2 月 29 日不返回 1 月 30,31 日
【发布时间】:2020-01-03 22:59:10
【问题描述】:

我在 SQL Server 2014 中工作,需要从 SQL Server DateTime 准确计算一个月前,但我无法弄清楚如何正确使用 DATEADD

例子:

SELECT DATEADD(MONTH, -1, '20200229')

返回2020-01-29

SELECT DATEADD(MONTH, -1, '20200301')

返回2020-02-01

但在第二个语句中,我想得到2020-01-302020-01-31

有什么想法吗?

【问题讨论】:

  • 到底是什么问题?
  • 这看起来没问题,3 月初前 1 个月,2 月初。
  • 你说 Dateadd 工作不正常。您能否参考一个可以证实您的主张的来源?
  • 嗯,我想他想要上个月的最后一天,因为他是当月的最后一天。
  • 该代码和输入/输出对我来说看起来不错。从29 february 中减去 1 个月将返回31 january,这将是相当出乎意料的。

标签: sql sql-server datetime datediff dateadd


【解决方案1】:

您似乎想要上个月末,在这种情况下,将EOMONTH() 添加到您的脚本中,如下所示

Select EOMONTH( DATEADD(MONTH,-1,'20200229'));

Select EOMONTH( DATEADD(MONTH,-1,'20200301'));

【讨论】:

    【解决方案2】:

    来自docs

    如果以下情况属实:

    • datepart 是月份,日期月份的天数比返回月份的天数多
    • 返回月份中不存在日期日期

    然后,DATEADD 返回返回月份的最后一天。

    例如,九月有 30(三十)天;因此,这些语句返回 2006-09-30 00:00:00.000:

    SELECT DATEADD(month, 1, '20060830');
    SELECT DATEADD(month, 1, '20060831');
    

    【讨论】:

      【解决方案3】:

      2020 年是闰年。大多数情况下,您的2/29 无论如何都不起作用。 也没有2/30 & 2/31 所以1/30 & 1/31 不会出现。

      【讨论】:

        【解决方案4】:

        使用带有可选第二个参数的 EOMONTH() 函数,它是一个 int,是与日期相差的月数:

        select eomonth('2020-02-29', -1);
        

        返回:

        2020-01-31
        

        【讨论】:

          【解决方案5】:

          请试试这个。

          SELECT DATEADD(DAY,1,DATEADD(MONTH, -1, '20200229')), DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, DATEADD(MONTH, -2, '20200301')) + 1, 0))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-02-15
            • 1970-01-01
            • 2014-03-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多