【问题标题】:How to show day name in SQL Server?如何在 SQL Server 中显示日期名称?
【发布时间】:2019-09-15 21:37:51
【问题描述】:

我在 SQL 服务器上有一个查询

我想显示如下:

CDATE      | CDAY
2019-04-01 | Monday
2019-04-02 | Tuesday
...        | ......
2019-04-30 | Tuesday

但我发现错误如下:

从字符转换日期和/或时间时转换失败 字符串。

如果有人可以帮忙请帮忙

DECLARE @V_DATE DATE = GETDATE()

;WITH CTE_DATE AS (
        SELECT  DATEADD(dd,-(DAY(@V_DATE)-1),@V_DATE) CDATE,
        DATENAME(dw, CONVERT(varchar, DATEADD(dd,-(DAY(@V_DATE)-1),@V_DATE))) CDAY
        UNION ALL
        SELECT  DATEADD(dd,1,CDATE),
        DATENAME(dw, CONVERT(varchar, DATEADD(dw,1,CDAY)))
        FROM    CTE_DATE
        WHERE   DATEADD(dd,1,CDATE) <= DATEADD(dd,-(DAY(DATEADD(mm,1,CDATE))),DATEADD(mm,1,CDATE))

    )
    SELECT * FROM CTE_DATE

【问题讨论】:

  • 采取更小的步骤。从一个基本的单一 SELECT 开始。
  • 仅使用 cte 生成日期,在主查询中修复日期名称。
  • 我认为您也可以删除将日期转换为 varchar 的部分,具体取决于您的需要。

标签: sql sql-server date sql-server-2017


【解决方案1】:

你的问题是:

DATENAME(dw, DATEADD(dw, 1, CDAY))

我想你打算:

DATENAME(dw, DATEADD(dw, 1, CDATE))

我会将 CTE 写为:

WITH CTE_DATE AS (
        SELECT  DATEADD(day ,-(DAY(@V_DATE)-1),@V_DATE) as CDATE, 
                DATENAME(dw, DATEADD(day, -(DAY(@V_DATE) - 1), @V_DATE)) as CDAY
        UNION ALL
        SELECT  DATEADD(day, 1, CDATE),
                DATENAME(dw, DATEADD(dw, 1, CDATE))
        FROM    CTE_DATE
        WHERE   DATEADD(day, 1, CDATE) <= DATEADD(day, -(DAY(DATEADD(month, 1, CDATE))), DATEADD(month, 1, CDATE))

    )
    SELECT *
    FROM CTE_DATE;

Here 是一个 dbfiddle。

你没有描述你想要代码做什么。它对字符串进行了不必要的转换,并且对于您想要做的事情来说可能是不必要的复杂。

【讨论】:

  • baik terima kasih。 ini sangat membantu
【解决方案2】:

无需转换为 varchar 即可获得工作日。

 UNION ALL
        SELECT  DATEADD(dd,1,CDATE),
        DATENAME(dw, CONVERT(varchar, DATEADD(dw,1,CDAY))) -- No need to convert to varchar in order to get weekday.
        FROM    CTE_DATE
        WHERE   DATEADD(dd,1,CDATE) <= DATEADD(dd,-(DAY(DATEADD(mm,1,CDATE))),DATEADD(mm,1,CDATE))

您可以使用 datename 函数直接获取它。

  DECLARE @V_DATE DATE = GETDATE()

    ;WITH CTE_DATE AS (
            SELECT  DATEADD(dd,-(DAY(@V_DATE)-1),@V_DATE) CDATE,
                    DATENAME(dw, CONVERT(varchar, DATEADD(dd,-(DAY(@V_DATE)-1),@V_DATE))) CDAY
            UNION ALL
            SELECT  DATEADD(dd,1,CDATE),
                    DATENAME(dw,  DATEADD(dd,1,CDATE)) -- modified 
            FROM    CTE_DATE
            WHERE   DATEADD(dd,1,CDATE) <= DATEADD(dd,-(DAY(DATEADD(mm,1,CDATE))),DATEADD(mm,1,CDATE))

        )
        SELECT * FROM CTE_DATE

【讨论】:

  • 愿意花 30 秒时间解释你的所作所为吗?
  • 这看起来非常相似,如果您解释了您应用于答案的更改,它将对读者有所帮助。
【解决方案3】:

您可以很快使用datename() 函数(从 v.2008 开始使用

  select datename( weekday, getdate() ) as day

  day
  ------
  Friday  -- > "for today(2019-04-26)"

Demo

或者你的情况:

with t(cdate) as
(
 select '2019-04-01' union all
 select '2019-04-02' union all
 select '2019-04-30'    
)    
select cdate, datename( weekday, cdate  ) as cday
  from t;

+----------+-------+
| cdate    | cday  |
+----------+-------+
|2019-04-01|Monday |
|2019-04-02|Tuesday|
|2019-04-30|Tuesday|
+----------+-------+

【讨论】:

    【解决方案4】:

    无需修复 CTE 中的日期名称,仅用于生成日期。

    DECLARE @V_DATE DATE = GETDATE()
    
    WITH CTE_DATE AS
    (
        SELECT  DATEADD(day ,-(DAY(@V_DATE)-1),@V_DATE) as CDATE
        UNION ALL
        SELECT  DATEADD(day, 1, CDATE)
        FROM    CTE_DATE
        WHERE   DATEADD(day, 1, CDATE) <= DATEADD(day, -(DAY(DATEADD(month, 1, CDATE))), DATEADD(month, 1, CDATE))
    )
    SELECT CDATE, DATENAME(dw, CDATE) FROM CTE_DATE
    

    【讨论】:

      【解决方案5】:

      无需CONVERT 日期。使用FORMAT 函数。并使用EOMONTH函数:

      DECLARE @V_DATE DATE = DATEADD(DAY, 1, EOMONTH(GETDATE(), -1));
      WITH CTE_DATE AS (
          SELECT @V_DATE CDATE
      
          UNION ALL
      
          SELECT DATEADD(dd, 1, CDATE)
          FROM   CTE_DATE
          WHERE  DATEADD(dd, 1, CDATE) <= EOMONTH(@V_DATE)
      )
      SELECT CDATE, FORMAT(CDATE, 'dddd') AS CDAY, FORMAT(CDATE, 'ddd') AS CDAYSHORT
      FROM CTE_DATE
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 2012-08-21
        • 1970-01-01
        相关资源
        最近更新 更多