如何在SQL Server中显示日期名称?

Mom*_*omo 7 sql sql-server date sql-server-2017

我在SQL Server上有一个查询

我想显示如下:

CDATE      | CDAY
2019-04-01 | Monday
2019-04-02 | Tuesday
...        | ......
2019-04-30 | Tuesday
Run Code Online (Sandbox Code Playgroud)

但是我发现错误如下:

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

请有人帮忙

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
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 2

你的问题是:

DATENAME(dw, DATEADD(dw, 1, CDAY))
Run Code Online (Sandbox Code Playgroud)

我认为你打算:

DATENAME(dw, DATEADD(dw, 1, CDATE))
Run Code Online (Sandbox Code Playgroud)

我会将 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;
Run Code Online (Sandbox Code Playgroud)

是一个 db<>fiddle。

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