2011-08-26 32 views
1

SQL服務器正顯示出除了1月份之外的1號2011年第53週週,並需要一週1SQL服務器沒有顯示正確的週數爲給定的日期

下面是查詢和輸出:

declare @T table (dt datetime) 
insert into @T values 
('2010-12-26'), 
('2010-12-27'), 
('2010-12-28'), 
('2010-12-29'), 
('2010-12-30'), 
('2010-12-31'), 
('2011-01-01'), 
('2011-01-02'), 
('2011-01-03'), 
('2011-01-04'), 
('2011-01-05'), 
('2011-01-06'), 
('2011-01-07'), 
('2011-01-08') 
select dt,DATEPART(wk,dt) from @T 

輸出:

2010-12-26 00:00:00.000 53 
2010-12-27 00:00:00.000 53 
2010-12-28 00:00:00.000 53 
2010-12-29 00:00:00.000 53 
2010-12-30 00:00:00.000 53 
2010-12-31 00:00:00.000 53 
2011-01-01 00:00:00.000 1 
2011-01-02 00:00:00.000 2 
2011-01-03 00:00:00.000 2 
2011-01-04 00:00:00.000 2 
2011-01-05 00:00:00.000 2 
2011-01-06 00:00:00.000 2 
2011-01-07 00:00:00.000 2 
2011-01-08 00:00:00.000 2 

我希望SQL Server從12月26日1顯示1周 - 1月1日。有人知道如何做到這一點?

感謝和問候, Aschwin。

回答

0

我不確定它是否適用於所有年份(但它看起來像)但您可以使用CASE聲明解決此問題。

SELECT dt 
     , CASE WHEN DATEPART(wk, dt) <> 53 
       THEN DATEPART(wk, dt) 
       ELSE 1 
      END 
FROM @T 

新的ISO_WEEK datepart不適用於您的請求輸出。

1

這比我第一次預料的要難得多。我正在比較去年年底,看看它是否有資格成爲新年的一部分。如果是這樣,我把這周設置爲1,否則我只是使用正常的一週。

declare @T table (dt datetime) 
insert into @T values 
('2010-12-25'), 
('2010-12-26'), 
('2010-12-27'), 
('2010-12-28'), 
('2010-12-29'), 
('2010-12-30'), 
('2010-12-31'), 
('2011-01-01'), 
('2011-01-02'), 
('2011-01-03'), 
('2011-01-04'), 
('2011-01-05'), 
('2011-01-06'), 
('2011-01-07'), 
('2011-01-08'), 
('2011-12-31'), 
('2012-01-01') 

select dt, 
week = case when dt + 6 - datediff(day, -1, dt) % 7 = dateadd(year, datediff(year,-1, dt), 0) 
then 1 else datepart(week, dt) end from @t 

證明:

http://data.stackexchange.com/stackoverflow/q/110527/

0

我創建2個函數來處理這個問題 1),以獲得第一或 2日當週的最後一天),以獲得星期數或年

函數1

CREATE FUNCTION [dbo].[fn_GetDayOf] 
(
    @Date datetime, 
    [email protected] int = 7, 
    @Mode int =1 
) 
/* 
    Mode 1: First Day Of Week 
    Mode 2: Last Day Of Week 
*/ 

RETURNS datetime 
WITH EXECUTE AS CALLER 
BEGIN 
    Declare @Return datetime 

    --SET DATEFIRST @FirstDayOfWeek 

    IF @Mode = 1 
    BEGIN 
     select @Return = dateadd(day,-(datepart(weekday,@date)-1),convert(date,@date)) 
    END 
    ELSE IF @Mode = 2 
    BEGIN 
     select @Return = dateadd(SECOND,-1,convert(datetime,dateadd(day,(datepart(weekday,@date)),convert(date,@date)))) 
    END 
    ELSE 
    BEGIN 
     SET @Return = @Date 
    END 
    --SET DATEFIRST 7 

    RETURN @Return 
END 

功能2

CREATE FUNCTION [dbo].[fn_GetYearWeek] 
(
    @Date datetime, 
    [email protected] int = 7, 
    @Mode int =1 
) 
/* 
    Mode 1 = Week Number 
    Mode 2 = Year 
*/ 
RETURNS INT 
BEGIN 
    declare @Return int 
    IF @Mode = 1 
    BEGIN 
     select @Return = case when datepart(week,[dbo].[fn_GetDayOf] (@Date,1)) <> datepart(week,[dbo].[fn_GetDayOf] (@Date,2)) then datepart(week,[dbo].[fn_GetDayOf] (@Date,1)) else datepart(week,[dbo].[fn_GetDayOf] (@Date,2)) end 
    END 
    ELSE IF @Mode = 2 
    BEGIN 
     select @Return = case when datepart(WEEK,[dbo].[fn_GetDayOf] (@Date,1)) <> datepart(week,[dbo].[fn_GetDayOf] (@Date,2)) then datepart(YEAR,[dbo].[fn_GetDayOf] (@Date,1)) else datepart(YEAR,[dbo].[fn_GetDayOf] (@Date,2)) end 
    END 
    ELSE 
    BEGIN 
     SET @Return = -1 
    END 

    Return @Return 
END 

運行實例

declare @T table (dt datetime) 
insert into @T values 
('2010-12-25'), 
('2010-12-26'), 
('2010-12-27'), 
('2010-12-28'), 
('2010-12-29'), 
('2010-12-30'), 
('2010-12-31'), 
('2011-01-01'), 
('2011-01-02'), 
('2011-01-03'), 
('2011-01-04'), 
('2011-01-05'), 
('2011-01-06'), 
('2011-01-07'), 
('2011-01-08'), 
('2011-12-31'), 
('2012-01-01'), 
('2012-01-02'), 
('2012-12-31'), 
('2013-01-01') 

select 
    dt, 
    datepart(week,dt), 
    --case when datepart(week,[dbo].[fn_GetDayOf] (dt,1)) <> datepart(week,[dbo].[fn_GetDayOf] (dt,2)) then datepart(week,[dbo].[fn_GetDayOf] (dt,1)) else datepart(week,[dbo].[fn_GetDayOf] (dt,2)) end 
    [dbo].[fn_GetYearWeek] (dt,1), 
    [dbo].[fn_GetYearWeek] (dt,2) 
from @T 

結果:

0

另一種方法來檢索周在當年的總人數:

DECLARE @LASTDAY DATETIME 
DECLARE @weeks INT 
SET @LASTDAY = DATEADD(ms,-3,DATEADD(yy,0,DATEADD(yy,DATEDIFF(yy,0,GETDATE())+1,0))) 
SELECT @weeks = CASE DATEname(dw,@LASTDAY) 

    WHEN 'MONDAY' THEN DATEPART(WK, DATEADD(wk,DATEDIFF(wk,7,@LASTDAY),5)) 
    WHEN 'TUESDAY' THEN DATEPART(WK, DATEADD(wk,DATEDIFF(wk,7,@LASTDAY),5)) 
    WHEN 'WEDNESDAY' THEN DATEPART(WK, DATEADD(wk,DATEDIFF(wk,7,@LASTDAY),5)) 
    ELSE DATEPART(WK, @LASTDAY) 
END 
select @weeks 
相關問題