【问题标题】:Datepart and @@datefirst differencesDatepart 和 @@datefirst 的区别
【发布时间】:2019-01-14 22:13:16
【问题描述】:

据我了解,DateFirst 是一周的第一天,或者一周的开始日。但是,当我运行这些查询时,我的结果与我认为我理解的不匹配

select @@datefirst,DATENAME(WEEKDAY,@@datefirst)
SELECT DATEPART(WEEKDAY,'20190113'),DATENAME(WEEKDAY,'20190113')
SELECT DATEPART(WEEKDAY,'20190114'),DATENAME(WEEKDAY,'20190114')
SELECT DATEPART(WEEKDAY,'20190115'),DATENAME(WEEKDAY,'20190115')
SELECT DATEPART(WEEKDAY,'20190116'),DATENAME(WEEKDAY,'20190116')
SELECT DATEPART(WEEKDAY,'20190117'),DATENAME(WEEKDAY,'20190117')
SELECT DATEPART(WEEKDAY,'20190118'),DATENAME(WEEKDAY,'20190118')
SELECT DATEPART(WEEKDAY,'20190119'),DATENAME(WEEKDAY,'20190119');

我明白了

7 Monday (this is the @@datefirst line)
1 Sunday
2 Monday
3 Tuesday
4 Wednesday
5 Thursday
6 Friday
7 Saturday

@@datefirst 如何给我 7 和星期天给我星期一,而 7 是星期六?这是配置问题还是我的误解?

【问题讨论】:

  • 我认为这可以帮助你:stackoverflow.com/q/20031802/9940803
  • DATENAME 需要一个日期作为它的参数,所以传递它7 实际上是传递它7 Jan 1900,我假设它是一个Monday
  • 如果您没有关注DATENAME(WEEKDAY,@@datefirst)@DaleBurrell 指的是您的这部分代码。您应该将其添加为 ander Dale :)
  • 另外值得注意的是DATEPARTDATENAMEWEEKDAY返回的值是相对于@@DATEFIRST返回的值,这是绝对的,即当@@DATEFIRST是@987654335时@(总是星期天)DATEPART 返回7 这是星期六(这让我很困惑)。 docs.microsoft.com/en-us/sql/t-sql/functions/…
  • @DaleBurrell 在以下文档中提到,如果输入与指定的日期部分不相关,它将返回默认值。查看我的答案以获取更多信息

标签: sql sql-server tsql date


【解决方案1】:

基于以下Microsoft Documentation

该函数返回一个字符串,表示指定日期的指定日期部分。

语法: DATENAME ( datepart , date )


更新 1

在同一篇文章中,在以下部分:为不在日期参数中的日期部分返回默认值

如果日期参数的数据类型没有指定的日期部分,只有当日期参数有文字时,DATENAME 才会返回该日期部分的默认值。

例如,任何日期数据类型的默认年月日为 1900-01-01。该语句有 datepart 的日期部分参数,日期的时间参数,并且 DATENAME 返回 1900, January, 1, 1, Monday

因此,当您输入数字 7 时,输入被视为 1900-01-01 07:00:00,它返回 Monday

如果你转到 SQL Server 并运行以下命令

select DATENAME(WEEKDAY,'1900-01-01 07:00:00')

返回

Monday

【讨论】:

    【解决方案2】:

    您对@@DATEFIRST 的理解是正确的。

    @@DATEFIRST 是一个返回一周第一天的函数,其默认值取决于系统环境。

    例如,如果您更改语言,@@DATEFIRST 默认值将根据该语言设置进行更改。 虽然,@@DATEFIRST 可以手动设置,无需更改语言设置。

    因此,在您的示例结果中,第 7 天(即星期日)在您的系统中被定义为一周的第一天,但​​是,当您在日期函数(例如 DATENAME() )中使用它时,它'会给你一个不正确的结果,因为@@DATEFIRST 将返回一个整数(从 1 到 7),而日期函数采用 DATE 或 DATETIME 输入而不是整数。那些,您使用@@DATEFIRST 的方法效率不高。 @@DATEFIRST 有多种用途,其中一种用途是获取正确的工作日。

    让我们举一个简单的例子。我当前的 @@DATEFIRST 设置设置为 7,我想创建一个标量函数,它总是给我即将到来的星期天的日期。所以,我可以用这个:

    SELECT DATEADD(DW, @@datefirst - DATEPART(DW, GETDATE()) + 1 , GETDATE())
    

    这总是给我从今天开始的下个星期天。比方说,我的一个客户在另一个国家,有不同的一周开始(比方说星期一 = 1)。我不需要对上面的代码进行任何更改,我只需要执行以下代码:

    SET DATEFIRST 1
    

    现在,这将为我的客户提供当前日期的第一个星期一,而无需对我的实际查询进行进一步自定义。

    这只是一个简单的例子,让您了解@@DATEFIRST的用法

    您可以查看这些参考资料以了解更多信息。

    @@DATEFIRST (Transact-SQL)

    SET DATEFIRST (Transact-SQL)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 2012-09-11
      • 1970-01-01
      • 2013-08-07
      • 2011-10-20
      • 2020-01-23
      相关资源
      最近更新 更多