在一年的第一天动态设置日期第一



我在SQL查询中首先设置日期时遇到了问题。这是我使用 IF、Else If 设置的代码。但是我需要一个sql语句而不是IF,否则IF。

DECLARE @CurrentDate DATE, @FirstDayOfWeek INT
SELECT @CurrentDate = DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
SELECT @FirstDayOfWeek = DATEPART(DW,@CurrentDate)
IF @FirstDayOfWeek = 6
    SET DATEFIRST 5; --friday
ELSE IF @FirstDayOfWeek = 7
    SET DATEFIRST 6; --sunday
--AND SO ON
DATEPART(DW, . . .)的结果

取决于 @@DATEFIRST 的当前值,因此在设置新值 @@DATEFIRST 时需要考虑到这一点。 最简单的方法是将@@DATEFIRST设置回 1,获取一周中的当前日期,然后将@@DATEFIRST设置为该日期。

顺便说一句,如果您只想要日期时间的日期,则可以将其转换为 DATE . 但是,最终,无需将日期时间转换为日期,因为无论哪种方式,DATEPART(DW, . . .)的结果都是相同的。

DECLARE @CurrentDate DATE, @CurrentDayOfWeek INT
SET @CurrentDate = CAST(GETDATE() AS DATE)
SET DATEFIRST 1 -- normalize first day of week
SET @CurrentDayOfWeek = DATEPART(DW, @CurrentDate)
SET DATEFIRST @CurrentDayOfWeek

DECLARE @CurrentDayOfWeek INT
SET DATEFIRST 1 -- normalize first day of week
SET @CurrentDayOfWeek = DATEPART(DW, GETDATE())
SET DATEFIRST @CurrentDayOfWeek

例:

DECLARE @CurrentDayOfWeek INT
SET DATEFIRST 1 -- normalize first day of week to Monday
SET @CurrentDayOfWeek = DATEPART(DW, '2016-01-01') -- a Friday, which will be 5 because first day of week is currently 1
SET DATEFIRST @CurrentDayOfWeek -- first day of week is now 5 (Friday)
我知道

你的问题提到了DATEFIRST,但是你有什么理由不根据自今年年初以来的天数来计算它吗?

SELECT ((DATEPART(DY, GETDATE()) - 1) % 7) + 1

旧答案:

只是要提到,如果DATEFIRST已从默认值 7 更改,这将不再有效,因为DATEPART(dw,...)将返回不同的值。 与SET DATEFIRST一起使用的值始终为 1 = 星期一,7 = 星期日,依此类推。 你总是可以提前到SET DATEFIRST 7...

基本上你正在做的是减去 1,如果你达到 0,则回滚到 7。 你可以只使用 mod 运算符 ( % ) 来做到这一点:

看看这是否适合你

DECLARE @CurrentDate DATETIME, @FirstDayOfWeek INT
SELECT @CurrentDate = DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)
SELECT @FirstDayOfWeek = DATEPART(DW,@CurrentDate)
SELECT @FirstDayOfWeek = (SELECT CASE @FirstDayOfWeek
WHEN 6 THEN 5
WHEN 7 THEN 6
END )
SET DATEFIRST @FirstDayOfWeek

最新更新