1

我正在寻找一个相当于 的 SQL Server UDF DATEPART(WEEK, @date),但允许调用者指定一周的第一天。有点类似于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.

4

3 回答 3

0

你可以使用这样的东西:

DATEPART(WEEK, DATEADD(DAY, 8 - @firstdayofweek, @date))

而不是移动一周的第一天,而是移动实际日期。使用此公式,一周的第一天将使用与 MS SQL Server 使用的天数相同的数值来设置。(星期日 = 1,星期六 = 7)

于 2013-08-28T20:32:43.943 回答
0

我发现了几篇文章帮助我回答了这个问题:

  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)
于 2013-10-30T16:27:46.010 回答
0
/*
不管@@DATEFIRST 是怎样的
返回结果为
工作日名称,工作日编号
莫1
涂2
3
4
法郎 5
萨6
苏7
*/

创建函数 dbo.fnFixWeekday
(
    @currentDate 日期
)
返回整数
作为
开始
    -- 获取 DATEFIRST 设置
    声明 @ds int = @@DATEFIRST
    -- 获取当前 DATEFIRST 设置下的星期几
    声明@dow int = DATEPART(dw,@currentDate)

    返回 1+(((@dow+@ds) % 7)+5) % 7

结尾
于 2013-12-03T12:48:30.933 回答