測試我會扔我的帽子環太。 :-)
DECLARE @Date datetime = '01/11/2015'
DECLARE @StartDate datetime = DATEADD(d, (1 - (DATEDIFF(d, CAST('1899.12.31' AS datetime), @Date - 6) % 7)), @Date - 6) -- MONDAY
DECLARE @EndDate datetime = DATEADD(d, (5 - (DATEDIFF(d, CAST('1899.12.31' AS datetime), @Date - 6) % 7)), @Date - 6) -- FRIDAY
SELECT '@Date' as Variable ,CONVERT(date, @Date) as DateValue ,DATENAME(dw, @Date) as DayOfTheWeek
UNION SELECT '@StartDate' as Variable ,CONVERT(date, @StartDate) as DateValue ,DATENAME(dw, @StartDate) as DayOfTheWeek
UNION SELECT '@EndDate' as Variable ,CONVERT(date, @EndDate) as DateValue ,DATENAME(dw, @EndDate) as DayOfTheWeek
-- Variable DateValue DayOfTheWeek
-- ---------- ---------- ------------
-- @Date 2015-01-11 Sunday
-- @StartDate 2015-01-05 Monday
-- @EndDate 2015-01-09 Friday
獎勵:在這裏,您可以使用相同的技術生成5個工作日的快速表。
SELECT DATENAME(dw, DATEADD(d, TT.DaysToAdd, DATEADD(d, (1 - (DATEDIFF(d, CAST('1899.12.31' AS datetime), @Date - 6) % 7)), @Date - 6))) as DayOfTheWeek
, DATEADD(d, TT.DaysToAdd, DATEADD(d, (1 - (DATEDIFF(d, CAST('1899.12.31' AS datetime), @Date - 6) % 7)), @Date - 6)) as DateValue
FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 as DaysToAdd FROM (VALUES(0),(0),(0),(0),(0)) a(n)) as TT
-- DayOfTheWeek DateValue
-- ------------------------------ -----------------------
-- Monday 2015-01-05 00:00:00.000
-- Tuesday 2015-01-06 00:00:00.000
-- Wednesday 2015-01-07 00:00:00.000
-- Thursday 2015-01-08 00:00:00.000
-- Friday 2015-01-09 00:00:00.000
這裏有一個解釋:
1)首先,我們需要知道的日期從開始我們的評測。在這個例子中,我們選擇使用週日,1月11日,2015年
DECLARE @Date2 datetime = '01/11/2015'
1B)這裏是一個不錯的一週的日子越來越名字的獎金技術,給定一個日期值
SELECT @Date2 as DateValue, DATENAME(dw, @Date2) as DayOfTheWeek
2)接下來,我們需要知道的確定性(根據美國日曆)什麼星期的某一天是
- 數字1至7注:1899年12月31日是1900年1月1日之前的第一個星期日,這是MINIMUM值f或SmallDateTime數據類型。
- 注意:是的,你可以這樣使用DATEPART(DW,@date)更簡單,但它給出的是不確定性,某些服務器環境可能有不同的配置
結果:1 =星期日| 2 =星期一| 3 =星期二| 4 =星期三| 5 =星期四| 6 =星期五| 7 =週六
SELECT ((DATEDIFF(d, CAST('1899.12.31' AS datetime), @Date2) % 7) + 1) [DayOfWeek Deterministic (Based on US)]
3)現在,給定任意日期,你應該有確定的週一,鑑於本週
SELECT DATEADD(d, (1 - (DATEDIFF(d, CAST('1899.12.31' AS datetime), @Date2) % 7)), @Date2) as [Monday Day of the Week - Deterministic (Based on US)]
4)現在,以確定的方式,給定任意日期,你應該確定週五爲某一週
SELECT DATEADD(d, (5 - (DATEDIFF(d, CAST('1899.12.31' AS datetime), @Date2) % 7)), @Date2) as [Monday Day of the Week - Deterministic (Based on US)]
5)的最後日期操縱技術的一個確定的方式,我們需要的是知道如何進入一個星期的平日之前的第一個星期。例如,如果我們在星期天,我們從中減去1天,那麼我們到達星期六,這使我們在前一週,這是平日的第一個整週。另外,如果我們也從星期一減去1天,那麼它只會讓我們到週日,而不是前一週,所以減去1天是不夠的。另一方面,如果我們在星期六並且減去7天,它將使我們超過前一週的平日,進入前一週,這太過分了。下面是分析的一個縮減,找出可以減去的神奇數字,這將在一週中的任何一天工作。正如你可以看到下面,一個神奇的數字是6。
-- DAYS TO SUBTRACT
-- Day of the Week - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7
-- =============== ==== ==== ==== ==== ==== ==== ==== ====
-- Sunday Bad Good Good Good Good Good Good Good
-- Monday Bad Bad Good Good Good Good Good Good
-- Tuesday Bad Bad Bad Good Good Good Good Good
-- Wednesday Bad Bad Bad Bad Good Good Good Good
-- Thursday Bad Bad Bad Bad Bad Good Good Good
-- Friday Bad Bad Bad Bad Bad Bad Good Good
-- Saturday Good Good Good Good Good Good Good Bad
獎金)如果你想擁有所有平日裏小桌子,然後你想還使用了快速零基礎「理貨表」。有很多方法可以做到這一點,所以選擇你的味道。這裏有一些。
SELECT * FROM (SELECT 0 as DaysToAdd UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) as TT
SELECT * FROM (SELECT TOP 5 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 as DaysToAdd FROM sys.all_columns a CROSS JOIN sys.all_columns b) as TT
SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 as DaysToAdd FROM (VALUES(0),(0),(0),(0),(0)) a(n)) as TT
這個問題是非常相似的http://stackoverflow.com/questions/4025047/tsql-function-to-calculate-30-working-days-date-from-a-specified-date-sql-服務器 –
@Brian Dishaw是的,也許它看起來像那個問題,但給定的代碼不是很好,答案不被接受。順便說一句,6個問題,你還沒有接受任何答案 –