2013-07-08 70 views
-1

我正在嘗試編寫SQL以填充客戶的日曆表,其中客戶的營業周是星期五至星期四。我需要填寫幾個每個都定義了不同的營業周的客戶。我想填寫以下字段:星期五從星期開始的週數

WeekBeginDate 
WeekEndDate 
WeekNo 
WeekYear 

這是結果集的例子:

Date  WeekBeginDate WeekEndDate DayofWeek WeekNo WeekYear 
01/03/13 12/28/12  01/03/2013  Thursday 52  2012 
01/04/13 01/04/13  01/10/2013  Friday 1 2013 
+3

根據什麼填充?你試過什麼了? –

+2

根據您的結果集,您將如何區分一個客戶的一週與另一個客戶的一週? 「DayofWeek」是什麼意思? (2013年3月1日和2013年10月1日都是星期四)。 –

回答

0

我會假設你有你需要的日期範圍內的日期表避免循環。然後,您可以利用SET DATEFIRST來改變每週的第一天:http://msdn.microsoft.com/en-us/library/ms181598(v=sql.105).aspx

然後,以下應返回正確的結果。以下是使用你的星期五的例子。我還在列表中包含了一個「CustomerID」,以防您需要根據客戶的不同而變化。

--Set the first day of the week as Friday. For other customers with different week start days, vary this setting 
set datefirst 5 

select 
    1 AS CustomerID, --or whatever you use as a customerid 
    CalendarDate, 
    dateadd(dd, (-1 * datepart(dw, calendardate)) + 1, calendardate) as WeekBeginDate, 
    dateadd(dd, (7 - datepart(dw, calendardate)), calendardate) as WeekEndDate, 
    datename(dw, calendardate) as DayofWeek, 
    datepart(wk, dateadd(dd, (-1 * datepart(dw, calendardate)) + 1, calendardate)) - 1 as Week No, 
    datepart(yyyy, dateadd(dd, (-1 * datepart(dw, calendardate)) + 1, calendardate)) as WeekYear 
FROM 
    dates --my dates table 
where 
    calendardate between '12/28/12' and '1/5/14' 
+0

此SQL對大多數日期非常適用;然而,如果一週中的第一天也是一年中的第一天,則不起作用。在我的例子中,星期五是本週的開始;因此1/1/2010和1/1/2016返回0作爲WeekNo。 – user2561495

0

要獲得所有播種的日期,你可以使用這樣的事情:

Select DateAdd (D, ROW_NUMBER() Over (Order By C1.Ordinal_Position), '12/31/1999') DateValue 
From INFORMATION_SCHEMA.COLUMNS C1, INFORMATION_SCHEMA.COLUMNS C2 

如果你有過幾個列運行在數據庫上面的查詢,然後更改從待。笛卡爾產品FTW

From INFORMATION_SCHEMA.COLUMNS C1, INFORMATION_SCHEMA.COLUMNS C2, 
    INFORMATION_SCHEMA.COLUMNS C3, INFORMATION_SCHEMA.COLUMNS C4 

現在,您需要每週的不同日子成爲第一天。所以請閱讀SET DATEFIRST。這可讓您將特定會話的第一天設置爲TSQL。

然後,您可以使用DATEPART來獲取您需要的其他列。

將三者結合起來得到您的答案。我將爲您提供一個如何完成這項工作的示例 - 您可以使用DATEADD查詢來獲取Start-Of-Week和End-Of-Week值,以及DATEPART獲得Week-Of-Year和YearN-棕褐色

SET DATEFIRST 3 -- put your corresponding day here 

;With AllDates AS 
(
Select 
    DateAdd (D, ROW_NUMBER() Over (Order By C1.Ordinal_Position), '12/31/1999') DateValue 
From INFORMATION_SCHEMA.COLUMNS C1 
), 
AllDatesWithWeekDayNumber AS 
(
Select 
    DateValue, 
    DatePart (weekday, DateValue) WeekDayNumber 
From AllDates 
) 
Select * From AllDatesWithWeekDayNumber 
相關問題