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

时间:2014-07-22 00:41:10

标签: sql sql-server

我有一个查询,其中我获得了日期的 WeekDay ,但默认情况下:

  • 星期日= 1

  • Moday = 2

功能是:

DATEPART(dw,ads.date) as weekday

我需要结果:

  • 星期日= 7

  • 星期一= 1

有没有捷径可以做到这一点?或者我必须做CASE statement

12 个答案:

答案 0 :(得分:52)

这样就可以了。

SET DATEFIRST 1;

-- YOUR QUERY

实施例

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

答案 1 :(得分:34)

您可以使用如下公式:

(weekday + 5) % 7 + 1

如果您决定使用此功能,那么值得通过一些示例来说服自己确实实现了您想要的功能。

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

(weekday  + @@DATEFIRST + 5) % 7 + 1

答案 2 :(得分:12)

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

SET DATEFIRST 1

答案 3 :(得分:9)

我建议你自己使用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)

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

答案 4 :(得分:1)

另一种解决方案如下:

ISNULL(NULLIF(DATEPART(dw,DateField)-1,0),7)

答案 5 :(得分:0)

我认为这可行:

  select
    case when datepart(dw,[Date]) = 1 then 7 else DATEPART(DW,[Date])-1 end as WeekDay

答案 6 :(得分:0)

这是由运行SQL Server服务的帐户引起的。例如;

如果SQL Server服务在DOMAIN \ MyUserAccount下运行,则需要登录并设置相关语言。

如果未设置此帐户,则SQL Server将默认为sa帐户以及运行该语言的语言。

我发现我们的sa帐户设置为英语,星期一的DW =2。DOMAIN \ MyUserAccount帐户已设置并更改为英式英语,星期一的DW返回为1。

希望这会有所帮助

答案 7 :(得分:0)

尝试一下:

CREATE FUNCTION dbo.FnDAYSADDNOWK(
          @addDate AS DATE, 
          @numDays AS INT
       ) RETURNS DATETIME AS

    BEGIN
    WHILE @numDays > 0 BEGIN
        SET @addDate = DATEADD(day, 1, @addDate)    
        IF DATENAME(DW, @addDate) <> 'sunday' BEGIN
            SET @numDays = @numDays - 1 
        END
    END

    RETURN CAST(@addDate AS DATETIME)
END

答案 8 :(得分:0)

看起来DATEFIRST设置是唯一的方法,但是无法在标量/表值函数中创建SET语句。因此,遵循您的代码的同事很容易出错。 (成为其他人的陷阱)

实际上,应该改进SQL Server datepart函数以代替接受此参数。

与此同时,使用星期的英文名称似乎是最安全的选择。

答案 9 :(得分:0)

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

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

monday = 1

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 1 ) % 7) + 1;

sunday = 1

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 7 ) % 7) + 1;

friday = 1

((DatePart(WEEKDAY, getdate()) + @@DATEFIRST + 6 - 5 ) % 7) + 1;

答案 10 :(得分:-1)

您需要设置DATEFIRST。看看这篇文章。我相信这应该有所帮助。

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-datefirst-transact-sql

答案 11 :(得分:-4)

我认为

DATEPART(dw,ads.date - 1) as weekday 

会起作用。