从数字获取 SQL 服务器中的日期名称时出现问题

Problem when getting the day name in SQL Server from a number

我正在尝试从 SQL 获取 dayname,作为输入的只是一个代表星期几的数字。

当我运行这段代码

select  
    datename(dw, '20210115'),
    datepart(dw, '20210115') 

它returns Friday, 6

所以我认为数字 6 意味着 Friday

然后我执行以下操作

select datename(dw, 6)

但不是返回 Friday 它 returns Sunday

那么,从 SQL 服务器获取 dayname 的正确方法是什么,只输入一个工作日数字作为输入?

DateName()DatePart()依赖于特定的设置(例如SET DATEFIRST

因此,虽然 6 的值现在对您来说可能代表“星期五”,但相同的代码可能 return 在不同的会话中对您或其他用户来说是不同的值。

这就是为什么我不使用这些功能,而是创建一个带有元数据的日历 table 来通知我星期几的原因。

我使用的代码如下所示:

...
     , CASE WHEN DateDiff(dd, '1900-01-01', the_date) % 7 = 0 THEN 1 ELSE 0 END As is_monday
     , CASE WHEN DateDiff(dd, '1900-01-01', the_date) % 7 = 1 THEN 1 ELSE 0 END As is_tuesday
     , CASE WHEN DateDiff(dd, '1900-01-01', the_date) % 7 = 2 THEN 1 ELSE 0 END As is_wednesday
     , CASE WHEN DateDiff(dd, '1900-01-01', the_date) % 7 = 3 THEN 1 ELSE 0 END As is_thursday
     , CASE WHEN DateDiff(dd, '1900-01-01', the_date) % 7 = 4 THEN 1 ELSE 0 END As is_friday
     , CASE WHEN DateDiff(dd, '1900-01-01', the_date) % 7 = 5 THEN 1 ELSE 0 END As is_saturday
     , CASE WHEN DateDiff(dd, '1900-01-01', the_date) % 7 = 6 THEN 1 ELSE 0 END As is_sunday
...

这将适用于所有 SQL 服务器数据库,无论设置如何。

如果您只想 return 日期名称,则可以写成:

CASE DateDiff(dd, '1900-01-01', the_date) % 7
  WHEN 0 THEN 'Monday'
  WHEN 1 THEN 'Tuesday'
  WHEN 2 THEN 'Wednesday'
  WHEN 3 THEN 'Thursday'
  WHEN 4 THEN 'Friday'
  WHEN 5 THEN 'Saturday'
  WHEN 6 THEN 'Sunday'
END AS day_of_week

此方法的工作原理

我们计算输入(在这些示例中 the_date)和已知的固定时间点之间的天数。

使用日期 1900-01-01 是因为它是“默认”(不是正确的词,但我现在想不出更好的词!)即 0 将被转换为。

1900-01-01 也正好是 星期一!

在那之后的第 7 天是另一个星期一,这就是模数 7 (% 7) 位负责计算的结果!