[英]SQL Server UDF for getting week of year, with first day of week argument
我正在尋找與DATEPART(WEEK, @date)
等效的SQL Server UDF,但允許調用者指定一周的第一天。 有點類似於MySql的WEEK
函數。 例如:
CREATE FUNCTION Week (@date date, @firstdayofweek int)
RETURNS int
BEGIN
-- return result would be the same as:
-- SET DATEFIRST @firstdayofweek
-- DATEPART(WEEK, @date)
END
我的應用程序沒有機會調用SET DATEFIRST
。
例子:
SELECT Week('2013-08-28', 2) -- returns 35
SELECT Week('2013-08-28', 3) -- returns 36
不管SQL Server的@@DATEFIRST
值如何,以上結果始終是相同的。
您可以使用如下形式:
DATEPART(WEEK, DATEADD(DAY, 8 - @firstdayofweek, @date))
您無需移動星期的第一天,而是移動實際的日期。 使用此公式,將使用與MS SQL Server使用的天相同的數字值來設置一周的第一天。 (星期日= 1,星期六= 7)
我找到了幾篇文章來幫助我回答這個問題的答案:
可能可以簡化此UDF,但它確實為我提供了我想要的東西:
CREATE FUNCTION Week (@date DATETIME, @dateFirst INT)
RETURNS INT
BEGIN
DECLARE @normalizedWeekOfYear INT = DATEDIFF(WEEK, DATEADD(YEAR, DATEDIFF(YEAR, 0, @date), 0), @date) + 1
DECLARE @jan1DayOfWeek INT = DATEPART(WEEKDAY, DATEADD(YEAR, DATEDIFF(YEAR, 0, @date), 0) + @@DATEFIRST- 7) - 1
DECLARE @dateDayOfWeek INT = DATEPART(WEEKDAY, DATEADD(DAY, @@DATEFIRST- 7, @date)) - 1
RETURN @normalizedWeekOfYear +
CASE
WHEN @jan1DayOfWeek < @dateFirst AND @dateDayOfWeek >= @dateFirst THEN 1
WHEN @jan1DayOfWeek >= @dateFirst AND @dateDayOfWeek < @dateFirst THEN -1
ELSE 0
END
END
GO
然后,執行以下語句將分別返回35和36:
SELECT dbo.Week('2013-08-28', 2)
SELECT dbo.Week('2013-08-28', 3)
/* No matter how @@DATEFIRST is return result as weekdayName,weekdayNumber Mo 1 Tu 2 Wn 3 Th 4 Fr 5 Sa 6 Su 7 */ CREATE FUNCTION dbo.fnFixWeekday ( @currentDate date ) RETURNS INT AS BEGIN -- get DATEFIRST setting DECLARE @ds int = @@DATEFIRST -- get week day number under current DATEFIRST setting DECLARE @dow int = DATEPART(dw,@currentDate) RETURN 1+(((@dow+@ds) % 7)+5) % 7 END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.