【问题标题】:SQL- Date Diff- # of week in each month between two date periodsSQL- 日期差异- 两个日期期间之间每个月的周数
【发布时间】:2014-10-12 13:37:28
【问题描述】:

问题:在列中显示每个月在两个日期期间之间的周数(现在最多三个月就可以了)。如果可能,从当天开始(动态)

我现在在哪里:

SELECT Q3.[Begin Date]
    ,Q3.[End Date]
    ,Q3.Diff_in_Year
    ,sum(CASE 
            WHEN Q3.Year_Counter = 0
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y1
    ,sum(CASE 
            WHEN Q3.Year_Counter = 1
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y2
    ,sum(CASE 
            WHEN Q3.Year_Counter = 2
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y3
    ,sum(CASE 
            WHEN Q3.Year_Counter = 3
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y4
    ,sum(CASE 
            WHEN Q3.Year_Counter = 4
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y5
    ,sum(CASE 
            WHEN Q3.Year_Counter = 5
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y6
    ,sum(CASE 
            WHEN Q3.Year_Counter = 6
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y7
    ,sum(CASE 
            WHEN Q3.Year_Counter = 7
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y8
    ,sum(CASE 
            WHEN Q3.Year_Counter = 8
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y9
    ,sum(CASE 
            WHEN Q3.Year_Counter = 9
                THEN datediff(mm, Q3.y_start, Q3.y_end) + 1
            ELSE 0
            END) Y10
FROM (
    SELECT Q1.[Begin Date]
        ,Q1.[End Date]
        ,Q1.years Diff_in_Year
        ,Q2.number AS Year_Counter
        ,(
            CASE 
                WHEN Q2.number = 0
                    THEN Q1.[Begin Date]
                ELSE dateadd(yy, datediff(yy, 0, dateadd(yy, q2.number, q1.[Begin Date])), 0)
                END
            ) AS y_Start
        ,(
            CASE 
                WHEN ((Q1.years - 1) = Q2.number)
                    THEN Q1.[End Date]
                ELSE DATEADD(yy, DATEDIFF(yy, 0, dateadd(yy, q2.number + 1, q1.[Begin Date]) + 1), - 1)
                END
            ) AS y_End
        ,Year(Q1.[Begin Date]) + Q2.number YearInYYYY
    FROM (
        SELECT [Begin Date]
            ,[End Date]
            ,DATEDIFF(year, [Begin Date], [End Date]) + 1 AS years
        FROM my dates
        ) Q1
    INNER JOIN master..spt_values Q2 ON Q2.type = 'P'
        AND Q2.number < Q1.years
    ) Q3
GROUP BY Q3.[Begin Date]
    ,Q3.[End Date]
    ,q3.Diff_in_Year

当前代码的工作原理:给定日期范围,两个日期之间每年的月数。 IE 1/1/2014 - 1/18/2015 将给出两列“2014”和 2015”,2014 的值为 12,2015 的值为 1,表示指定日期之间有 13 个月。

What I am hoping to achieve is something similar to
Start Date    End Date  Month 1   Month 2   Month 3
-----------------------------------------------------
1/1/2014      3/8/2014      4        4         1 

【问题讨论】:

  • 你的问题一点都不清楚。 “我的”表是什么样的?也许从 sqlfiddle.com 开始可以帮助我们了解您的问题。
  • 我希望你的意思是[我的约会] 它的标题正是如此。开始日期和结束日期
  • 嘿,好吧,您在它周围没有括号,所以它显示为表格,将我的别名命名为日期。 ;) 所以让我们假设该表中有一行。计算输出的逻辑是什么?这里似乎有很多查询,但我不明白您要完成什么。
  • 您的标题显示 # 周,您的查询和文本表示 # 个月,而您想要的结果集是 # 周。你要哪个?
  • 顺便说一句:如果您在datediff 中使用mm 时遇到某种混淆,this article 可能有助于解释它。

标签: sql tsql date datediff date-difference


【解决方案1】:

除了动态 SQL 解决方案(在 TSQL 中搜索动态枢轴)之外,我还提出了几个答案。由于您的问题不清楚您需要数周还是数月,因此我为每个问题快速整理了一个。

Example Here:

declare @startdate date = '1/1/2014', @enddate date = '3/1/2015'
select p.*
from (
    select @startdate as StartDate, @enddate as EndDate, right(convert(varchar,(dateadd(mm,RowID-1,@startdate)),105),4) [Group]
    from (
        select *, row_number()over(order by name) as RowID
        from master..spt_values
        ) d
    where d.RowID <= datediff(mm, @startdate, @enddate)
    ) t
    pivot (
        count([Group]) for [Group] in (
            [2014],[2015]
        )
    ) p

Example Here:

declare @startdate date = '1/1/2014', @enddate date = '3/1/2015'
select p.*
from (
    select @startdate as StartDate, @enddate as EndDate, right(convert(varchar,(dateadd(ww,RowID-1,@startdate)),105),7) [Group]
    from (
        select *, row_number()over(order by name) as RowID
        from master..spt_values
        ) d
    where d.RowID <= datediff(ww, @startdate, @enddate)
    ) t
    pivot (
        count([Group]) for [Group] in (
              [01-2014]
            , [02-2014]
            , [03-2014]
            , [04-2014]
            , [05-2014]
            , [06-2014]
            , [07-2014]
            , [08-2014]
            , [09-2014]
            , [10-2014]
            , [11-2014]
            , [12-2014]
            , [01-2015]
            , [02-2015]
            , [03-2015]
        )
    ) p

【讨论】:

  • 第二个代码绝对是我要找的!谢谢!
猜你喜欢
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2022-10-02
  • 2011-06-06
相关资源
最近更新 更多