[英]How to show day name in SQL Server?
I have a query on the SQL server 我在SQL服务器上有一个查询
I want to display as below: 我想显示如下:
CDATE | CDAY
2019-04-01 | Monday
2019-04-02 | Tuesday
... | ......
2019-04-30 | Tuesday
But I found error as below: 但我发现错误如下:
Conversion failed when converting date and/or time from character string.
从字符串转换日期和/或时间时转换失败。
Please if someone can help 请有人帮忙
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
No need to convert to varchar in order to get weekday. 无需转换为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))
you can directly get it using datename function. 你可以使用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
You can shortly use datename()
function( used since v.2008 ) 您可以很快使用
datename()
函数( 自v.2008起使用 )
select datename( weekday, getdate() ) as day
day
------
Friday -- > "for today(2019-04-26)"
or as in your case : 或者在你的情况下:
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|
+----------+-------+
Your problem is: 你的问题是:
DATENAME(dw, DATEADD(dw, 1, CDAY))
I think you intend: 我想你打算:
DATENAME(dw, DATEADD(dw, 1, CDATE))
I would write the CTE as: 我会把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 is a db<>fiddle. 这是一个db <>小提琴。
You don't describe what you want the code the code to do. 您没有描述代码要执行的代码。 It has unnecessary conversions to string and might be needlessly complicated for what you want to do.
它对字符串进行了不必要的转换,对于您想要做的事情可能会不必要地复杂化。
No need to fix the day names inside the CTE, use it only to generate the dates. 无需在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
No need to CONVERT
dates. 无需
CONVERT
日期。 Use the FORMAT
function. 使用
FORMAT
功能。 And use EOMONTH
function: 并使用
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.