如何从SQL中的当前日期获取下一个9周的数字?

时间:2013-05-28 12:34:14

标签: sql sql-server-2008 week-number

如果我在2015-12-31给出日期,则必须显示为

    2015W53, for 2015-12-31, which means Week 53, and next follows as
    2016W1,  Next as
    2016W2,  Next as
    2016W3   Next as...

我的逻辑是

    DECLARE @WEEK VARCHAR(2), @YEAR VARCHAR(4) 
    SELECT @YEAR = DATEPART(YY,@DATE), @WEEK = CAST(DATEPART(WK,@DATE) AS INT) % 52 ; 
     IF(CAST(DATEPART(WK,@DATE) AS INT) % 52 = 0) 
       SET @WEEK = 52; 
     IF(CAST(DATEPART(WK,@DATE) AS INT) = 53) 
       SET @YEAR = CAST(@YEAR AS INT) + 1; 
     IF (LEN(@WEEK) < 2) 
    BEGIN 
      SET @WEEK = LEFT('0' + @week, 2) 
    END 
    RETURN @YEAR + @WEEK

但是 2015W53 缺失了,接下来的9周了,

我只想要一年中的最后一周.., 多次尝试但无法得到。 任何帮助都非常感谢。

4 个答案:

答案 0 :(得分:1)

您可以根据需要进行连接。无需循环

SELECT
    YEAR(DATEADD(week, X.Y, BaseDate)),
    DATEPART(ISO_WEEK, DATEADD(week, X.Y, BaseDate))
FROM
    (SELECT CAST('20151231' AS date) AS BaseDate) D
    CROSS JOIN
    (
    VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8)
    ) AS X(Y);

更新 SQL Server 2008添加了修复周编号的ISO_WEEK datepart

这几乎可行,因为根据SQL Server,第2周将于2016年1月3日开始。这与ISO week numbering不同。

答案 1 :(得分:0)

您可能不会将@WEEK设置为DATEPART(WK,@DATE) % 52,因为有些年份超过52周!如果每年只有52周,事情会很容易。

为什么不直接确定给定@DATE的周,然后使用DATEADD添加一周,看看会出现什么?你这样做了9次,你就得到了你想要的东西。

例如:

DECLARE @yearsAndWeeks TABLE (Year INT, Week INT)

DECLARE @i INT
SET @i = 0

DECLARE @Date DATETIME
SET @Date = '20151231'

WHILE @i < 9
BEGIN
    INSERT INTO @yearsAndWeeks (Year, Week) VALUES (DATEPART(yy, @Date), DATEPART(ISO_WEEK, @Date))
    SET @Date = DATEADD(WK, 1, @Date)
    SET @i = @i + 1
END

SELECT * FROM @yearsAndWeeks

答案 2 :(得分:0)

@Date 是您希望周数据的开始日期, @NumberOfWeeks 是您想要数据的后续周数。请根据需要修改这些值。

 --Create the temp table to hold the data
    IF OBJECT_ID('TempDB..#Dates') IS NOT NULL
    DROP TABLE #Dates;

CREATE TABLE #Dates
(   [Year]          INT NOT NULL,
    [WeekNumber]    INT NOT NULL,
    [RequiredWeek]  NVARCHAR(255) NOT NULL,
    [Date]          DATETIME NOT NULL
);


--DECLARE @Date        Datetime='2016-1-1';   --for testing
--DECLARE @Date        Datetime='2016-12-31'; --for testing
DECLARE @Date          Datetime='2015-12-31';
DECLARE @Days          INT;
DECLARE @NumberOfWeeks INT;
DECLARE @Ctr           INT=0;

SET @NumberOfWeeks=9 

WHILE @Ctr<@NumberOfWeeks
BEGIN
    SET @Days=@Ctr*7

    INSERT INTO #Dates
    SELECT  DATEPART(YEAR,@Date+@Days) AS [Year],
            DATEPART(wk,@Date+@Days) AS [WeekNumber],
            CAST(DATEPART(YEAR,@Date+@Days) AS VARCHAR(10))+'W'+ CAST(DATEPART(wk,@Date+@Days) AS VARCHAR(10)) AS [RequiredWeek],
            @Date+@Days AS [Date]
    SET @Ctr=@Ctr+1
END

SELECT * FROM #Dates;

输出:

Year    WeekNumber  RequiredWeek    Date
2015    53          2015W53          2015-12-31 00:00:00.000
2016    2           2016W2           2016-01-07 00:00:00.000
2016    3           2016W3           2016-01-14 00:00:00.000
2016    4           2016W4           2016-01-21 00:00:00.000
2016    5           2016W5           2016-01-28 00:00:00.000
2016    6           2016W6           2016-02-04 00:00:00.000
2016    7           2016W7           2016-02-11 00:00:00.000
2016    8           2016W8           2016-02-18 00:00:00.000
2016    9           2016W9           2016-02-25 00:00:00.000

答案 3 :(得分:0)

为了进一步根据您的需求进行定制,并且存在使此解决方案不具有通用性的风险,以下是在2015W53之后给出2016W1的代码,假设开始日期为“2015年12月31日”

--Create the temp table
IF OBJECT_ID('TempDB..#Dates') IS NOT NULL
DROP TABLE #Dates;

CREATE TABLE #Dates
(   [Year]          INT NOT NULL,
    [WeekNumber]    INT NOT NULL,
    [RequiredWeek]  NVARCHAR(255) NOT NULL,
    [Date]          DATETIME NOT NULL
);


--DECLARE @Date Datetime='2016-1-1';
--DECLARE @Date Datetime='2016-12-31';
DECLARE @Date Datetime='2015-12-31';
DECLARE @Days INT;
DECLARE @NumberOfWeeks INT;
DECLARE @Ctr INT=0;

SET @NumberOfWeeks=9 

WHILE @Ctr<@NumberOfWeeks
BEGIN
    IF (@Date ='2015-12-31' AND @Ctr=1)  -- To handle 1st week of Jan 2016
    SET @Days=@Ctr+1
    else if (@Date ='2015-12-31' AND @Ctr=0) --To Handle last week of Dec 2015
    SET @Days=(@Ctr)*7
    else
    SET @Days=(@Ctr-1)*7   --for rest of the weeks of 2016

    INSERT INTO #Dates
    SELECT  DATEPART(YEAR,@Date+@Days) AS [Year],
            DATEPART(wk,@Date+@Days) AS [WeekNumber],
            CAST(DATEPART(YEAR,@Date+@Days) AS VARCHAR(10))+'W'+ CAST(DATEPART(wk,@Date+@Days) AS VARCHAR(10)) AS [RequiredWeek],
            @Date+@Days AS [Date]
    SET @Ctr=@Ctr+1
END

SELECT * FROM #Dates;