【问题标题】:SQL Server: Check if current day is SundaySQL Server:检查当前日期是否为星期日
【发布时间】:2025-12-11 20:40:01
【问题描述】:

在有条件的情况下,我想检查当前日期是否独立于本地设置,所以我已经完成了:

DECLARE @IsSunday BIT

SELECT 
    @IsSunday = CASE  
                   WHEN DATEPART(DW, getdate() + @@DATEFIRST - 1) = 7 
                      THEN 1 
                      ELSE 0 
                END 

IF @IsSunday
BEGIN
  // Do some stuff
END

我需要有人确认这将在任何本地设置下工作,例如,具有英语配置和其他语言的 SQL Server。

上面的代码在西班牙语配置中有效。

【问题讨论】:

  • 我的机器有默认的美国设置,它正在返回 1 = Sunday select getdate() , DATENAME(dw, getdate()+3), DATEPART(DW, getdate()+3 ) OUTPUT - 2017 -08-31 16:33:46.633 星期日 1
  • I need someone to confirm me that this will work under any local setting 这没有多大意义。您需要在一个区域设置下操作
  • 那么我怎样才能让它独立于本地设置工作呢?
  • 您可以使用 SET DATEFIRST 7 命令将星期日设置为一周的第一天,而不管您的 sql server 的区域设置如何
  • 您可以使用 DateName 函数查看日期。

标签: sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

选择任何一个星期日,例如20170910,并计算该星期日与您需要检查的日期之间的天数差。 如果模 7 的结果为 0,则表示星期天。

select case when datediff(day, '20170910', getdate()) % 7 = 0
         then 1
         else 0
       end;

【讨论】:

  • 但在这种情况下,我需要两个日期,而我只有一个,即当前日期
  • @user1624552 2017-09-10 应该在查询中硬编码并且永远不会改变。
  • @user1624552 你当然可以选择任何你想要的星期天,只要你确定它是星期天。您可以将 20170910 替换为例如 18991231,这也恰好是星期天。
  • 啊好吧,对不起,是的,你是对的。这行得通!谢谢!它独立于当地环境,英语、意大利语、西班牙语。那时所有语言都有效,因为您正在执行基于天数的差异。
【解决方案2】:

您可以在 sql server 中使用 DateName 函数。有关详细信息,请参阅以下查询。

DECLARE @IsSunday BIT
SELECT @IsSunday = CASE WHEN UPPER(DATENAME(DW, getdate())) = 'SUNDAY' THEN 1 ELSE 0 END 

IF @IsSunday
BEGIN
  // Do some stuff
END

【讨论】:

  • 在其他语言中,星期日可能被称为其他名称。运行此查询'select days from sys.syslanguages'
  • 这取决于您当前的语言,您可以使用 select @@language 获得。因此,'select days from sys.syslanguages where name = @@Language' 将为您提供当前语言的名称
【解决方案3】:

这是一种方法:

DECLARE @DATEFIRST int = @@DATEFIRST; -- Get the current first day of the week
SET DATEFIRST 7; -- Set the first day of the week to sunday (U.S default)

SELECT  CASE WHEN DATEPART(WEEKDAY, GETDATE()) = 1 THEN -- If the weekday is 1 it's Sunday
            1 
        ELSE 
            0 
        END As IsSunday;

SET DATEFIRST @DATEFIRST; -- set the first day of the week to back it's original value

当然,如果您不想将datefirst 设置回原来的值,您可以简单地将其设置为 7 并删除代码的第一行和最后一行。

另外,我已经测试了您的原始代码,它似乎工作正常:

DECLARE @i int = 1

WHILE @i < 8
BEGIN

SET DATEFIRST @i;

SELECT CASE WHEN (DATEPART(WEEKDAY, '2017-08-27') + @@DATEFIRST - 1) = 7 THEN 1 ELSE 0 END 


SET @i = @i + 1

END

每次返回 1。

【讨论】:

  • 还有什么方法可以避免触碰@@DATEFIRST,然后又回到原来的值?
  • 是的,我已经编辑了我的答案。不过,我认为 GuidoG 的答案更好。
【解决方案4】:

将您的日期的天数与已知星期日的日期进行比较

declare @IsSunday bit
Declare @yourdate date = '20170820'

select @IsSunday = case when datepart(dw, '20170827') = datepart(dw, @yourdate) 
                     then 1 -- sunday
                     else 0 -- not sunday
                   end

IF @IsSunday
BEGIN
  -- Do some stuff
END

其中 '20170827' 是一个已知的星期天,是一个常量,您不应更改

【讨论】:

  • 如果它有效并且对你有帮助,那么考虑给它一个赞成票