【问题标题】:Week calculation from a specific period特定时期的周计算
【发布时间】:2012-08-02 10:48:44
【问题描述】:

假设会计年度是从 7 月 1 日到 6 月 30 日。

我必须计算周数。相应地在 SQL Server 2005 中。

请推荐!

非常感谢!

【问题讨论】:

  • 第一周是从 7 月 1 日开始的前 7 天吗?因此,第 53 周最后 1 (或闰年 2) 天?
  • 您是从第 0 周开始还是从第 1 周开始?您对一年中第一周的定义是什么?
  • 在询问之前请使用谷歌,确保不要询问即使在同一个网站上也能找到的微不足道的东西。无论哪种情况,请更具体地说明您的问题并解释详细信息以获得更好的答案。

标签: sql sql-server


【解决方案1】:

如果您财政年度的第 1 周始终是 7 月 1 日至 7 月 7 日...

DECLARE
  @inputDate    DATETIME,
  @fYearStart   DATETIME,
  @weekNumber   INT
SET
  @inputDate    = getDate()
SET
  @fYearStart   = DATEADD(year, DATEDIFF(year, '20000101', DATEADD(month, -7, @inputDate)), '20000701')
SET
  @weekNumber   = DATEDIFF(day, @fYearStart, @inputDate) / 7 + 1


如果你的财务周总是周日到周六...

DECLARE
  @inputDate    DATETIME,
  @fYearStart   DATETIME,
  @weekNumber   INT
SET
  @inputDate    = getDate()
SET
  @fYearStart   = DATEADD(year, DATEDIFF(year, '20000101', DATEADD(month, -7, @inputDate)), '20000701')
SET
  @weekNumber   = DATEDIFF(WEEK, @fYearStart, @inputDate)


其中一个或其他应该适应你的week number的定义。

【讨论】:

  • 在日历表中,我有日期、财政年、财政期。如何在此表或视图中计算周数?
  • @user1571129 - 请在您的问题中包含该表中的示例数据,并显示您想要的结果示例。然后我们可以编写适用于该示例数据的代码。
  • 如果一周是从星期一开始的。
【解决方案2】:

试试这个并根据自己的需要使用变量@dt:

DECLARE @dt DATETIME = GETDATE()
SELECT WeekOfMonth = DATEPART(wk, @dt) - DATEPART(wk,DATEADD(m, DATEDIFF(M, 0, @dt), 0)) + 1

编辑: 我的错,因为我错误地理解了这个问题,我的解决方案返回了当月的一周,而不是一年。

使用@Dems 的部分答案并在此处更改我的答案是一个完整的工作测试,该测试基于临时表上可用的日期和财政年度的开始输出 3 列 WeekOfMonth、WeekOfYear 和 WeekOfFIscalYear。但我想对于一家特定的公司来说,一个财政年度的开始总是一样的。我只是添加了不同的日期和年份进行测试。

DECLARE @TT TABLE (auxVal       INT,
                   auxdate      DATETIME,
                   fiscal_year  DATETIME
                )

INSERT @TT 
SELECT 100,'19120101 00:00:00','19120701' UNION ALL
SELECT 200,'18120615 00:00:00','18110701' UNION ALL
SELECT 100,'20121121 00:00:00','20120701' UNION ALL
SELECT 200,'20120101 00:00:00','20110701' UNION ALL
SELECT 100,'20150802 00:00:00','20140701' UNION ALL
SELECT 200,'20120330 00:00:00','20110701' UNION ALL
SELECT 322,'20110228 00:00:00','20100701'

SELECT DATEDIFF(week, DATEADD(MONTH, DATEDIFF(MONTH, 0, auxDate), 0), auxDate) + 1 WeekOfMonth,
       DATEPART( wk, auxDate) WeekOfYear,
       DATEDIFF(DAY, (DATEADD(YEAR, DATEDIFF(YEAR, fiscal_year, DATEADD(MONTH, -7, auxDate)), fiscal_year)), auxDate) / 7 + 1  WeekOfFiscalYear
  FROM @TT

结果:

WeekOfMonth   WeekOfYear   WeekOfFiscalYear
-------------------------------------------
      1            1             27
      3            25            51
      4            47            21
      1            1             27
      2            32            5
      5            13            40
      5            10            35
-------------------------------------------

【讨论】:

  • 为什么将输入循环到月初?基本方法DATEPART(wk, x) - DATEPART(wk, y) 产生负数,其中 x 比 y 早,即使 x 在 y 年之后。
  • 对不起,伙计们,我不知道你们是如何测试的。我正在测试几个不同的日期,我得到了正确的答案。
  • (DATEDIFF(day, '2012-07-01',calendar_date)/7)+1 AS WEEK 通过这个查询我也得到了周数。但是这里的一周是从周日到周六。但我想要从周日到周一。我怎样才能实现它?
  • +1 后一种解决方案对我来说效果很好,但我为学年对其进行了修改,因此 8 月的第一个星期一是第 1 周。
【解决方案3】:

这个对我有用:

SELECT dt AS DayDate,
CONVERT(VARCHAR,DATENAME(weekday,dt)) AS [DayOfWk],
CONVERT(int,CONVERT(VARCHAR,DATEPART(yyyy,dt)) + RIGHT('00' + CONVERT(VARCHAR,DATEPART(wk,dt)),2)) AS [WeekID],
'Week ' + CONVERT(VARCHAR,DATEPART(wk,dt))AS [WeekDsc],
DATEPART(wk,dt) AS [WeekNbr],
DATEADD(dd, -(DATEPART(dw, dt)-1), dt) AS [WeekStartDay],
DATEADD(dd, 7-(DATEPART(dw, dt)), dt) AS [WeekEndDay],
CONVERT(VARCHAR,CASE WHEN DATEPART(mm,dt) > 6 THEN DATEPART(yyyy,dt) + 1 ELSE DATEPART(yyyy,dt) END) + RIGHT('00'+ CONVERT(VARCHAR,DATEDIFF(week,DATEADD(dd, 7-(DATEPART(dw, CASE WHEN DATEPART(mm,dt) > 6 THEN CONVERT(VARCHAR,DATEPART(yyyy,dt)) + '-07-01' ELSE CONVERT(VARCHAR,DATEPART(yyyy,dt) - 1) + '-07-01' END)), CASE WHEN DATEPART(mm,dt) > 6 THEN CONVERT(VARCHAR,DATEPART(yyyy,dt)) + '-07-01' ELSE CONVERT(VARCHAR,DATEPART(yyyy,dt) - 1) + '-07-01' END) + 1,DATEADD(dd, -(DATEPART(dw, dt)-1), dt)) + 2) ,2) AS [FinWkID]
FROM 
(
    SELECT DATEADD(day,increment,'2014-01-01') dt
    FROM
    (
        SELECT top 5000 ROW_NUMBER() OVER (ORDER BY s1.[object_id]) - 1 AS increment
        FROM sys.all_objects AS s1
        CROSS JOIN sys.all_objects AS s2
        ORDER BY s1.[object_id]
    ) SQ
) DATE_GENERATOR

【讨论】:

    【解决方案4】:

    无需创建表。 只需将@date 替换为您的列日期名称

    declare @date datetime
    set     @date = '12/8/2016 00:00:00'
    
    select  case when datepart(month,@date) > 6 then 
    
                case when CEILING(datediff(day,'6/30/' + cast(datepart(year,@date) as nvarchar(4)),@date) / 7.0) > 52
                then 52 else CEILING(datediff(day,'6/30/' + cast(datepart(year,@date) as nvarchar(4)),@date) / 7.0) end
    
            else
                case when CEILING(datediff(day,'6/30/' + cast(datepart(year,@date)-1 as nvarchar(4)),@date) / 7.0) > 52
                then 52 else CEILING(datediff(day,'6/30/' + cast(datepart(year,@date)-1 as nvarchar(4)),@date) / 7.0) end
            end WorkWeek
    

    Compute Week number based on Fiscal Year

    【讨论】:

      【解决方案5】:
      try this
      
          select DATEPART(week,getdate())-DATEPART(week,'07-01-2012')
      
      To get the week number starting from July 1st 2012
      

      【讨论】:

      • 如果输入日期为1st Jan 2013,则返回负值。
      • 这个查询只给我本周。我必须列出 2000 财年以来的所有周数。
      • 通常SQL服务器会刷新每个新年开始的周数。这意味着它会计算从01-01-2012开始的周数。所以你喜欢每次重置周数吗?年份变化,或者您想获得自 2000 年 1 月 1 日以来的总周数?
      猜你喜欢
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多