从数字获取 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
) 位负责计算的结果!
我正在尝试从 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
) 位负责计算的结果!