【问题标题】:deriving calendar month from week number从周数导出日历月
【发布时间】:2010-07-26 06:24:11
【问题描述】:

我一直在寻找类似的东西,但找不到任何东西。

我有一个查询,提供每天发生的交易数量,需要按年、月、周分组,但当然有些月跨越多个周数,例如。 2009 年 9 月和 10 月。

以去年第 39 周(9 月和 10 月)为例。星期四是 10 月 1 日,因此该周的 4 天落在 10 月,因此 9 月最后 3 天的交易量应该添加到 10 月的第一周的总数中吗?清楚吗?

例如:

交易量----交易----年----月----周

1264.1730----53----2009----九月----37
2739.7200---109----2009----9月----38
522.5500-----21----2009----10月----39
1196.6450----51----2009----九月----39

2827.9550---113----2009----10月----40
2730.4050---110----2009----10月----41
3763.7200---154----2009----10月----42
3425.6250---137----2009----10月----43
3551.8100---143----2009----11月--44
2788.0150---113----2009----11月--45

【问题讨论】:

    标签: tsql


    【解决方案1】:

    问题在于日历很笨拙,而且您对此无能为力。据我所知,你有三个选择:

    1. 按年和月分组。在结果中显示星期或星期,但不要按它们分组。
    2. 按年和周分组。在结果中显示月份或月份,但不要按它们分组。
    3. 按年、月、周分组,并接受某些组包含少于一周的数据。 (即你现在拥有的)

    从您的描述看来,您需要选项 2:

    SELECT year, MIN(month), week, SUM(transaction)
    FROM Table1
    GROUP BY year, week
    

    【讨论】:

    • 和一个简单的 min(month) 或其他东西。
    【解决方案2】:

    这样的事情会做:

    -- For weeks starting Sunday and ending Saturday, the US default:
    SET DATEFIRST 7 
    
    -- Alternatively, for weeks starting Saturday and ending Friday:
    --SET DATEFIRST 6 
    
    SELECT 
      [Date]
    , DATENAME(WEEKDAY,[Date]) AS [DayOfWeek]
    , DATEADD(DAY,1-DATEPART(WEEKDAY,[Date]),[Date]) AS WeekStarting
    , DATEADD(DAY,7-DATEPART(WEEKDAY,[Date]),[Date]) AS WeekEnding
    FROM (
      SELECT CONVERT(DATETIME,'20100124') UNION ALL
      SELECT CONVERT(DATETIME,'20100125') UNION ALL
      SELECT CONVERT(DATETIME,'20100126') UNION ALL
      SELECT CONVERT(DATETIME,'20100127') UNION ALL
      SELECT CONVERT(DATETIME,'20100128') UNION ALL
      SELECT CONVERT(DATETIME,'20100129') UNION ALL
      SELECT CONVERT(DATETIME,'20100130') UNION ALL
      SELECT CONVERT(DATETIME,'20100131') UNION ALL
      SELECT CONVERT(DATETIME,'20100201') UNION ALL
      SELECT CONVERT(DATETIME,'20100202') UNION ALL
      SELECT CONVERT(DATETIME,'20100203') UNION ALL
      SELECT CONVERT(DATETIME,'20100204') UNION ALL
      SELECT CONVERT(DATETIME,'20100205') UNION ALL
      SELECT CONVERT(DATETIME,'20100206')
    ) a ([Date])
    

    然后,将您的一周开始或结束日期转换为一个月:

    SELECT *
    , WeekStartingMonthStart = DATEADD(DAY,1-DAY(WeekStarting),WeekStarting)
    , WeekStartingMonthEnd   = DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DAY(WeekStarting),WeekStarting)))
    , WeekEndingMonthStart   = DATEADD(DAY,1-DAY(WeekEnding),WeekEnding)
    , WeekEndingMonthEnd     = DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DAY(WeekEnding),WeekEnding)))
    FROM (
      SELECT 
        [Date]
      , DATENAME(WEEKDAY,[Date]) AS [DayOfWeek]
      , DATEADD(DAY,1-DATEPART(WEEKDAY,[Date]),[Date]) AS WeekStarting
      , DATEADD(DAY,7-DATEPART(WEEKDAY,[Date]),[Date]) AS WeekEnding
      FROM (
        SELECT CONVERT(DATETIME,'20100124') UNION ALL
        SELECT CONVERT(DATETIME,'20100125') UNION ALL
        SELECT CONVERT(DATETIME,'20100126') UNION ALL
        SELECT CONVERT(DATETIME,'20100127') UNION ALL
        SELECT CONVERT(DATETIME,'20100128') UNION ALL
        SELECT CONVERT(DATETIME,'20100129') UNION ALL
        SELECT CONVERT(DATETIME,'20100130') UNION ALL
        SELECT CONVERT(DATETIME,'20100131') UNION ALL
        SELECT CONVERT(DATETIME,'20100201') UNION ALL
        SELECT CONVERT(DATETIME,'20100202') UNION ALL
        SELECT CONVERT(DATETIME,'20100203') UNION ALL
        SELECT CONVERT(DATETIME,'20100204') UNION ALL
        SELECT CONVERT(DATETIME,'20100205') UNION ALL
        SELECT CONVERT(DATETIME,'20100206')
      ) a ([Date])
    ) a
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      相关资源
      最近更新 更多