【问题标题】:Why do DatePart and DateName return different values for the same date?为什么 DatePart 和 DateName 为同一日期返回不同的值?
【发布时间】:2017-07-04 14:54:39
【问题描述】:

我正在尝试从给定的日期字段中获取日期编号和名称。
但结果令人困惑。
比如下面的sql:

declare @date date = '20161018'

select datepart(dw, @date) as daynumber,
       datename(weekday, @date) as DayName,
       datename(weekday, 3) as DayNumber3,
       datename(weekday, 1) as DayNumber1

它产生这个结果:

daynumber   DayName     DayNumber3    DayNumber1    
3           Tuesday     Thursday      Tuesday   

如您所见,datepart 返回 3,当我在调用 datename 时使用此 datepart 时,它返回 Tuesday
但是当我用数字 3 直接调用 datepart 时,它返回 Thursday,当我用数字 1 直接调用 datepart 时,它返回 Tuesday

那么为什么 datepart(dw, @date) 返回 3 而不是 1 而 datename(weekday, @date) 返回正确的日期名称?

对我来说,重要的是获得数字 1 而不是 3,并且在这个日期仍然保持周二。

编辑:
我想要的 '20161018' 的期望输出是

daynumber    DayName
1            Tuesday

我怎样才能从我的例子中得到这个日期的结果?

【问题讨论】:

  • datename 的第二个参数是 DATE,因此 SQL Server 正在将 3 转换为实际日期。
  • datename(weekday, 3) 不会像您认为的那样做。它假定3 是实际日期(1900-01-04,因为日期时间中的日期从 1900-01-01 开始),并且该日期是星期四
  • 好的,谢谢,那么我怎样才能从日期字段中获取日期?
  • 你的意思是datepart(wk, @date)
  • 你是用datepart做的吗?

标签: sql-server datetime


【解决方案1】:

我认为你可以添加 5,mod 7 会得到如下结果:

Declare @date date = '20161018'

Select (datepart(dw, @date) + 5) % 7 as daynumber,
   datename(weekday, @date) as DayName,
   datename(weekday, 3) as DayNumber3,
   datename(weekday, 1) as DayNumber1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多