【问题标题】:Dateadd returning the wrong days in the monthDateadd 返回该月的错误日期
【发布时间】:2015-08-09 12:21:23
【问题描述】:

我有一个存储过程,用于提取给定月份的销售数据。 对于有 31 天的月份,它不会返回 31 天。 我需要一些帮助来理解以下字符串的分解

(dateadd(dd,-(datepart(dd,getdate())),CONVERT(CHAR(8),GetDate(),112)))+'23:59:59')

我知道CONVERT(CHAR(8),GetDate(),112) 采用系统日期并转换为YYYYMMDD,而datepart(dd,getdate()) 采用系统日期并仅采用日部分,但我无法破译整个字符串。

【问题讨论】:

    标签: sql-server dateadd


    【解决方案1】:

    您给出的表达式有问题。 23:59:59 之后的括号没有左大括号。

    但是表达式的意图是: (datepart(dd,getdate())) 获取当前日期部分

    CONVERT(CHAR(8),GetDate(),112)) 正在获取 YYYMMDD 中的当前日期

    (dateadd(dd,-(datepart(dd,getdate())),CONVERT(CHAR(8),GetDate(),112))) 正在从今天的日期中减去日部分(见负号)。

    因此它试图获取当月的第一天。如果上述表达式的结果超过上个月的最后一天,则增加 23 小时 59 分钟。

    该逻辑可能旨在获取上个月的最后一天。增加约 24 小时会造成混乱。

    【讨论】:

      【解决方案2】:

      这将帮助你:

      declare @First datetime = dateadd(month,datediff(month,0,getdate()),0)
      declare @Last  datetime = dateadd(second,-1,dateadd(month,datediff(month,0,getdate())+1,0))
      

      @First 检查从 ZERO 到 NOW 的月数,然后将该月数加到 ZERO 上,为您提供本月的第一刻。

      @Last 的工作方式类似,但在添加到零的月数上增加一个月,为您提供下个月的第一刻,然后从该日期减去 1 秒,为您提供本次最后一天的最后一秒月。

      如果你需要去MS,你可以把最后一位改为减去3毫秒而不是1秒。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 2019-07-19
        • 2015-09-27
        相关资源
        最近更新 更多