【问题标题】:Get week day name from a given month, day and year individually in SQL Server在 SQL Server 中分别从给定的月份、日期和年份获取工作日名称
【发布时间】:2013-12-05 02:10:50
【问题描述】:

我正在尝试从给定日期获取日期名称,例如星期五、星期六、星期日、星期一等。我知道有一个内置函数可以返回日期名称,例如:

SELECT DATENAME(dw,'09/23/2013') as theDayName 

此 SQL 查询返回:

'星期一'

这一切都好。但我想单独通过Month, Day and Year

我正在使用内置的 DATEPART 函数从日期中检索月、日和年,以便将其传递给 DATENAME 函数:

SELECT DATEPART(m, GETDATE()) as theMonth  -- returns 11
SELECT DATEPART(d, GETDATE()) as theDay   -- returns 20
SELECT DATEPART(yy, GETDATE()) as theYear   -- returns 2013

现在我分别拥有月、日、年值,我将其传递给我的DATENAME 以获取我想要的日期的Weekname

--my SQL query to return dayName
SELECT (DATENAME(dw, DATEPART(m, GETDATE())/DATEPART(d, myDateCol1)/ DATEPART(yy, getdate())))  as myNameOfDay, FirstName, LastName FROM myTable

这会返回错误的日期名称。我尝试将 / 替换为 - 以便在 DATENAME 函数中我的 SQL 查询变为:

SELECT DATENAME(dw,'09/23/2013') 
--becomes
SELECT DATENAME(dw,'09-23-2013') 

但它仍然从我的 SQL 查询中返回不正确的 dayName。我在这里错过了什么吗?

请指教。

【问题讨论】:

  • 请注意select @@DATEFIRST 设置为SET DATEFIRST 7;

标签: sql sql-server function date


【解决方案1】:

在 SQL 2005 和 2008 上测试并运行。不确定这是否适用于 2012 年及更高版本。

解决方案使用 DATENAME 而不是 DATEPART

select datename(dw,getdate()) --Thursday
select datepart(dw,getdate()) --2

这也适用于 sql 2014。

【讨论】:

    【解决方案2】:

    您需要构造一个日期字符串。您正在使用 /- 运算符,它们对 DATEPART 的数值返回值进行数学/数值运算。然后DATENAME 将获取该数值并将其解释为日期。

    您需要将其转换为字符串。例如:

    SELECT (
      DATENAME(dw, 
      CAST(DATEPART(m, GETDATE()) AS VARCHAR) 
      + '/' 
      + CAST(DATEPART(d, myDateCol1) AS VARCHAR) 
      + '/' 
      + CAST(DATEPART(yy, getdate()) AS VARCHAR))
      )
    

    【讨论】:

    • 选择日期名称(DW,GETDATE());这足以获得日期名称。
    • 这不是问题或问题,@AuthorPraWin
    • @EliGassert 已获批准,但这是 Google 中“tsql 日名称”一词的 Stack Overflow 最高结果,这个答案以及 AuthorPraWin 的有用附录立即帮助了我。
    【解决方案3】:

    如果您有 SQL Server 2012:

    如果您的日期部分是整数,那么您可以使用DATEFROMPARTS 函数。

    SELECT DATENAME( dw, DATEFROMPARTS( @Year, @Month, @Day ) )
    

    如果您的日期部分是字符串,那么您可以使用CONCAT 函数。

    SELECT DATENAME( dw, CONVERT( date, CONCAT( @Day, '/' , @Month, '/', @Year ), 103 ) )
    

    【讨论】:

      【解决方案4】:

      试试这样:select DATENAME(DW,GETDATE())

      【讨论】:

        【解决方案5】:
        SELECT DATENAME(DW,CONVERT(VARCHAR(20),GETDATE(),101))
        

        【讨论】:

        • 请提供更多详细信息(例如,简单说明您的 SQL 脚本的作用)。
        【解决方案6】:

        select to_char(sysdate,'DAY') from dual; 试试吧

        【讨论】:

        • OP 使用的数据库是 SQL Server。您的回复是针对 Oracle 的。它不会起作用。
        • 在问题中,已经提到DB是SQL。您为 Oracle 编写的
        【解决方案7】:

        我用过

        select
        case
        when (extract (weekday from DATE)=0) then 'Sunday'
        

        等等……

        0 星期日,1 星期一...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-19
          • 2010-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-11
          相关资源
          最近更新 更多