Sql 从特定时段开始计算周数

Sql 从特定时段开始计算周数,sql,sql-server,Sql,Sql Server,假设会计年度从7月1日到6月30日 我必须在SQLServer2005中相应地计算周数 请建议 非常感谢 如果您财政年度的第一周始终是7月1日至7月7日 try this select DATEPART(week,getdate())-DATEPART(week,'07-01-2012') To get the week number starting from July 1st 2012 DECLARE @inputDate DATETIME, @fYearStar

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

我必须在SQLServer2005中相应地计算周数

请建议


非常感谢

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

try this

    select DATEPART(week,getdate())-DATEPART(week,'07-01-2012')

To get the week number starting from July 1st 2012
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)


其中一项或另一项应适用于您对
周数的定义

尝试此项,并根据您自己的需要使用变量@dt:

DECLARE @dt DATETIME = GETDATE()
SELECT WeekOfMonth = DATEPART(wk, @dt) - DATEPART(wk,DATEADD(m, DATEDIFF(M, 0, @dt), 0)) + 1
编辑: 我的错因为我错误地理解了这个问题,所以我的解决方案返回的是一个月中的一周,而不是一年中的一周

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

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
-------------------------------------------

这一个对我有用:

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

无需创建表。 只需将@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

第一周是从7月1日开始的前七天吗?因此,第53周是最后1天(或闰年的2天)?你是从第0周还是第1周开始?你对今年第一周的定义是什么?请在提问之前使用谷歌,确保不要问一些即使在同一个网站上也能找到的琐碎问题。无论是哪种情况,请更具体地回答您的问题并解释详细信息,以便获得更好的答案。如果输入日期为2013年1月1日,则返回负值。此查询仅提供当前周。我必须列出2000财年的所有周数。通常SQL server会刷新从每年新年开始的周数。例如,这意味着它会计算从2012年1月1日开始的周数。因此,您希望在每年发生变化时重置周数,还是希望获得自2000年1月1日以来的总周数?为什么将输入四舍五入到月初?而基本方法
DATEPART(wk,x)-DATEPART(wk,y)
会产生负数,其中x在一年中早于y,即使x在y之后。对不起,各位,我不知道你们是如何测试的。我用几个不同的日期进行测试,我得到了正确的答案。(DATEDIFF(day,'2012-07-01',calendar_date)/7)+1作为星期通过这个查询,我也得到了星期数。但是在这里,这一周从星期天开始到星期六。但是我要从星期天到星期一。我该如何实现它?+1后一种解决方案对我很有效,但我在学年中对其进行了修改,以便8月的第一个星期一是第1周。在日历表中,我有日期、会计年度和会计期间。如何在此表或视图中计算weeknumber?@user1571129-请在问题中包含该表中的示例数据,并显示您想要的结果示例。然后,我们可以编写适用于该示例数据的代码。