簡體   English   中英

SQL Server UDF用於獲取一年的第幾周,並帶有“一周的第一天”參數

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

我找到了幾篇文章來幫助我回答這個問題的答案:

  1. 確定性標量函數以獲取日期中的星期

  2. http://sqlmag.com/t-sql/datetime-calculations-part-3

可能可以簡化此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM