2013-05-28 25 views
1

如果我給日期2015年12月31日,它必須顯示爲如何在SQL中獲取當前日期的下一個9週數字?

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缺失和IAM越來越接下來的9周,

我只是想我的一年的最後一週.., 試了很多次,但無法得到。 任何幫助非常感謝。

+0

它看起來像你的代碼試圖產生前導零,即'2016W01'不是'2016W1'像你的規格。 (FWIW我認爲領先的零是更好!) – Rup

回答

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中添加,修正了上週編號

這是因爲第2點在2016年1月3日開始,根據到SQL Server幾乎工作的ISO_WEEK datepart。這與ISO week numbering不同。

+0

這裏iam獲得輸出第一週失蹤,2015W52,2016W02 iam失蹤第一..... –

+0

如預期的那樣,根據我的鏈接 – gbn

+0

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

謝謝你會嘗試這種方式.. –

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 @[email protected]*7 

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

SELECT * FROM #Dates; 

OUTPUT:

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

但是這裏ccant我得到2015W53後,我想2016w1 ..,這是不可能的? –

+0

好吧,因爲我將2016年1月7日的持續時間添加爲7,這實際上是2016年第2周。現在,問題是2015年12月31日和2016年1月1日都在同一周。如果您的要求是固定的(即您的開始日期將始終爲2015年12月31日),那麼作爲例外,您可以在WHILE循環的第一次運行中添加1或2天的條件。 –

+0

謝謝..,有我的答案,:) –

0

爲了進一步定製,以您的需求和使該解決方案的非通用的風險,這裏是2015W53後給2016W1假設起始日期代碼「31 DEC 2015'

--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 @[email protected]+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,@[email protected]) AS [Year], 
      DATEPART(wk,@[email protected]) AS [WeekNumber], 
      CAST(DATEPART(YEAR,@[email protected]) AS VARCHAR(10))+'W'+ CAST(DATEPART(wk,@[email protected]) AS VARCHAR(10)) AS [RequiredWeek], 
      @[email protected] AS [Date] 
    SET @[email protected]+1 
END 

SELECT * FROM #Dates; 
相關問題