2011-07-28 332 views
3

T-SQL顯示周結束數據庫我有一個查詢,按星期分組使用DatePart(ww,[TimeEntryDate])列,它返回週數。我想顯示周結束日期,並像那樣永遠是星期六。當使用DatePart(ww,日期)

下面是完整的查詢

SELECT 
DatePart(year , [TimeEntryDate]) [YEAR], 
DatePart(ww , [TimeEntryDate]) Week, 
CategoryId, 
SUM(TimeEntryDuration) "Total Hours" 

    FROM [TIMETRACKER].[dbo].[aspnet_starterkits_TimeEntry] 
    GROUP BY DatePart(year , [TimeEntryDate]), DatePart(ww , [TimeEntryDate]) , CategoryId 
    ORDER BY 1,2,3 

data 
Year Week Category Total Hours 
2010  1  1   10 
2010  2   1   12 

回答

2

你可以嘗試以下

SELECT DatePart(year , [TimeEntryDate]) [YEAR], 
     DatePart(ww , [TimeEntryDate]) Week, 
     DATEADD(d, 7 - DATEPART(DW, [TimeEntryDate]), [TimeEntryDate]) as WeekEnding, 
     CategoryId, 
     SUM(TimeEntryDuration) "Total Hours" 
    FROM [TIMETRACKER].[dbo].[aspnet_starterkits_TimeEntry] 
GROUP BY DatePart(year , [TimeEntryDate]), DatePart(ww , [TimeEntryDate]) , CategoryId 
ORDER BY 1,2,3 

編輯:開始日期的設定是根據您的語言設置。美國英語的默認值是星期日7,但您需要驗證您的設置並相應地調整計算。您可以驗證設置,以確定哪些天是星期與

SELECT @@DATEFIRST; 

該查詢開始將說明的區別:

SET LANGUAGE Italian; 
GO 
SELECT @@DATEFIRST; 
GO 
SET LANGUAGE us_english; 
GO 
SELECT @@DATEFIRST; 

您還可以進行如下設置你的那一週開始日期。

SET DATEFIRST 1 
+0

我可能是錯的,但如果運說,星期六是週末,那麼很明顯星期天是它的初學者因此假設'DATEPART'在週日返回1而不是7是安全的。因此,您對'WeekEnding'的表達應該包含「6 - DATEPART ...」,而不是「7 - ...」。否則,我絕對同意這種做法。 –

+0

@ Andriy-m看起來SQL Server的默認設置爲星期一爲1,星期日爲7,所以表達式仍然有效。它會在SQL語句中產生正確的日期,這對我很有好處。 – Leons

+0

如果美國的大多數系統都是這種情況,週日開始的話,我會感到驚訝。這就是本地化的目的。 –

0

這會給你任何一週的週六日:(從@mwigdahl的this post提供)
**注:您不需要CONVERT()函數,但它使得它更具可讀性*

CONVERT(varchar(50), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, @date), @date)), 101) 

這是一個測試來證明它:

DECLARE @date smalldatetime 
SET @date = '7/1/11' 

DECLARE @week int 
SET @week = datepart(ww, @date) 

WHILE @week <= 32 --just to take the test through July 
BEGIN 
    SELECT 
     @week, 
     @date, 
     CONVERT(varchar(50), (DATEADD(dd, @@DATEFIRST - DATEPART(dw, @date), @date)), 101) 
    SET @date = @date + 1 
    SET @week = datepart(ww, @date) 
END