[英]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.