【问题标题】:Determine number of Days in month returns different count for Month of March确定月中的天数返回不同的三月数
【发布时间】:2016-05-27 17:48:28
【问题描述】:

这对你们来说很奇怪。

我需要确定一个月的天数

  ;WITH cteNetProfit AS 
(
   ---- NET PROFIT
    SELECT DT.CreateDate
        , SUM(DT.Revenue) as Revenue
        , SUM(DT.Cost)  as Cost
        , SUM(DT.GROSSPROFIT) AS GROSSPROFIT
        FROM
    (
        SELECT   CAST([createDTG] AS DATE) as CreateDate
             ,   SUM(Revenue) as Revenue
             ,   SUM(Cost)  as Cost
             ,   SUM(REVENUE - COST) AS GROSSPROFIT
        FROM [dbo].[CostRevenueSpecific]
        WHERE   CAST([createDTG] AS DATE) > CAST(GETDATE() - 91 AS DATE)
            AND CAST([createDTG] AS DATE) <= CAST(GETDATE() - 1 AS DATE)
        GROUP BY createDTG
        UNION ALL
        SELECT  CAST([CallDate] AS DATE) AS CreateDate
                ,   SUM(Revenue) as Revenue
                ,   SUM(Cost)   as Cost
                ,   SUM(REVENUE - COST) AS GROSSPROFIT
        FROM abc.PublisherCallByDay
        WHERE   CAST([CallDate] AS DATE) > CAST(GETDATE() - 91 AS DATE)
            AND CAST([CallDate] AS DATE) <= CAST(GETDATE() - 1 AS DATE)
        GROUP BY CALLDATE
    ) DT
    GROUP BY DT.CreateDate 
)
 select distinct MONTH(CREATEDATE), DateDiff(Day,CreateDate,DateAdd(month,1,CreateDate))
FROM cteNetProfit

由于某种原因,它返回了 2016 年 3 月的两个不同结果,一个结果是 30,另一个是 31(这当然是正确的)我验证基础数据只有 31 天的数据行进。由于二月是闰年,这会影响 DATEDIFF 功能。剩余月份返回正确的 #。

2   29
3   31
3   30
4   30
5   31

【问题讨论】:

  • 分享这两个三月 CreatedDate 可能有助于发现问题
  • 抱歉被 cmets 弄糊涂了,CreateDate 有一个月中每一天的数据,并且只有 1 组日期用于三月 - 没有重复的日期。那么,刚刚三月而不是剩余几个月重复的原因是什么?
  • 发布您的完整代码(编辑:cteNetProfit 里面有什么?哦,好吧,以防万一:)
  • select MONTH(CREATEDATE), DateDiff(Day,CreateDate,DateAdd(month,1,CreateDate)),CREATEDATE FROM cteNetProfit 应该会有所启发

标签: sql-server tsql


【解决方案1】:

感谢您的输入,但是我在其他地方找到了解决方案

select Distinct MONTH(CREATEDATE), Day(EOMONTH(CreateDate))
FROM cteNetProfit

【讨论】:

    【解决方案2】:

    当您到达 2016-03-31 日期时,差异就出现了。如果您针对 2016-03-30 和 2016-03-31 运行下面的查询,则在这两种情况下,使用 DATEADD 添加 1 MONTH 的结果都是 2016-04-30。它返回下个月的最后一天。

    SELECT DATEADD(MONTH,1,'2016-03-30') , DATEADD(MONTH,1,'2016-03-31')
    

    这种语法似乎有效(https://raresql.com/2013/01/06/sql-server-get-number-of-days-in-month/ 提供)。

    SELECT DAY(DATEADD(ms,-2,DATEADD(MONTH, DATEDIFF(MONTH,0,@DATE)+1,0))) AS [Current Month]
    

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 2020-01-12
      相关资源
      最近更新 更多