我在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