SQL DATEPART(dw,date)需要monday = 1和sunday = 7

VAA*_*AAA 37 sql sql-server

我有一个查询,我得到一个日期的WeekDay但默认情况下:

  • 星期日= 1

  • Moday = 2

  • 等等

功能是:

DATEPART(dw,ads.date) as weekday
Run Code Online (Sandbox Code Playgroud)

我需要结果:

  • 星期天= 7

  • 星期一= 1

  • 等等

这样做有什么捷径吗?或者我必须做一个CASE statement

SQL*_*hao 54

这样做.

SET DATEFIRST 1;

-- YOUR QUERY
Run Code Online (Sandbox Code Playgroud)

例子

-- Sunday is first day of week
set datefirst 7; 
select DATEPART(dw,getdate()) as weekday


-- Monday is first day of week
set datefirst 1;
select DATEPART(dw,getdate()) as weekday
Run Code Online (Sandbox Code Playgroud)

  • @RobForrest - 老实说,我也不喜欢。一个假设特定日期优先设置,另一个假设您*可以*设置它。但是,如果您在不同用户具有不同默认值的环境中创作视图或 UDF,则两者都不可能。 (3认同)
  • 我在 2018 年 6 月使用过这个答案,现在来这里是为了告诉大家 @Damien_The_Un believer 是对的。 (3认同)

Gre*_*ill 37

您可以使用如下公式:

(weekday + 5) % 7 + 1
Run Code Online (Sandbox Code Playgroud)

如果您决定使用它,那么值得通过一些示例来说服自己它实际上做了您想要的.

另外:为了不受DATEFIRST变量的影响(它可以设置为1到7之间的任何值),真正的公式是:

(weekday  + @@DATEFIRST + 5) % 7 + 1
Run Code Online (Sandbox Code Playgroud)

  • 虽然这适用于OP,但我认为如果用户的语言发生变化,它可能会中断. (2认同)

Dav*_*idG 12

您可以告诉SQL Server使用星期一作为一周的开始使用DATEFIRST,如下所示:

SET DATEFIRST 1
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 10

我建议您自己编写案例陈述datename():

select (case datename(dw, aws.date)
             when 'Monday' then 1
             when 'Tuesday' then 2
             when 'Wednesday' then 3
             when 'Thursday' then 4
             when 'Friday' then 5
             when 'Saturday' then 6
             when 'Sunday' then 7
        end)
Run Code Online (Sandbox Code Playgroud)

至少,如果有人在周开始的那一天更改参数,则不会改变.另一方面,它易受SQL Server选择的语言的影响.


Sha*_*pur 7

无论设置如何,您都可以使用此公式DATEFIRST

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - [first day that you need] ) % 7) + 1;
Run Code Online (Sandbox Code Playgroud)

为了monday = 1

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 1 ) % 7) + 1;
Run Code Online (Sandbox Code Playgroud)

并为sunday = 1

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 7 ) % 7) + 1;
Run Code Online (Sandbox Code Playgroud)

并为friday = 1

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 5 ) % 7) + 1;
Run Code Online (Sandbox Code Playgroud)