在MS SQL上,如何创建一个只包含日期和星期几的表?
我需要在MS SQL 2014上创建一个表,显示日期和工作日列。它需要从2014-01-01开始,最后一天应该是今天。它应该看起来像下面的一个:在MS SQL上,如何创建一个只包含日期和星期几的表?,sql,sql-server,sql-server-2014,Sql,Sql Server,Sql Server 2014,我需要在MS SQL 2014上创建一个表,显示日期和工作日列。它需要从2014-01-01开始,最后一天应该是今天。它应该看起来像下面的一个: days_date weekday 2014-01-01 Wednesday 2014-01-02 Thursday 2014-01-03 Friday ... ... 2018-03-06 Tuesday 我的相关脚本如下: CREATE TAB
days_date weekday
2014-01-01 Wednesday
2014-01-02 Thursday
2014-01-03 Friday
... ...
2018-03-06 Tuesday
我的相关脚本如下:
CREATE TABLE [dbo].[new_table](
[days_date] [date] NOT NULL,
[weekday] [nvarchar](50) NULL
) ON [PRIMARY]
GO
WITH CTE (DT) AS
(
SELECT CAST('2014-01-01' AS DATE) DT
UNION ALL
SELECT DATEADD(DAY, 1, DT)
FROM CTE
WHERE DATEADD(DAY, 1, DT) < '2018-03-06'
)
INSERT INTO [dbo].[new_table]
([days_date]
,[weekday])
VALUES
(select * from CTE,
,select DATENAME(CTE,GETDATE()))
GO
如何修复脚本?插入查询中出现了一些语法错误。 此外,您尝试插入的datename与getdate相关,我猜这不是您的目标。您应该参考您的CTE日期别名:DT 试试这个:
CREATE TABLE [dbo].[new_table](
[days_dates] [date] NOT NULL,
[weekday] [nvarchar](50) NULL
) ON [PRIMARY]
GO
WITH CTE (DT) AS
(
SELECT CAST('2014-01-01' AS DATE) DT
UNION ALL
SELECT DATEADD(DAY, 1, DT)
FROM CTE
WHERE DATEADD(DAY, 1, DT) < '2018-03-06'
)
INSERT INTO [dbo].[new_table]
([days_dates]
,[weekday])
(select * , DATENAME(WEEKDAY,dt) from CTE)
OPTION (MaxRecursion 0)
GO
不能在值内使用SELECT语句,而是使用SELECT替换值 按如下所示更改插入查询
;WITH CTE
(
DT
) AS
(
SELECT CAST('2014-01-01' AS DATE) DT
UNION ALL
SELECT
DATEADD(DAY, 1, DT)
FROM CTE
WHERE DATEADD(DAY, 1, DT) < '2018-03-06'
)
INSERT INTO [dbo].[new_table]
(
[days_date],
[weekday]
)
select
DT,
DATENAME(DW,DT)
from CTE
OPTION(maxrecursion 0)
-将遇到以下错误消息: Msg 530,16级,状态1,第1行 声明终止了。 在语句完成之前,已耗尽最大递归100。 为了克服此错误消息,可以指定MAXRECURSION查询提示,将最大递归次数从默认值100增加到最大值1000
CREATE TABLE [dbo].[new_table](
[days_date] [date] NOT NULL,
[weekday] [nvarchar](50) NULL
) ON [PRIMARY]
; WITH CTE (DT) AS
(
SELECT CAST('2014-01-01' AS DATE) DT
UNION ALL
SELECT DATEADD(DAY, 1, DT)
FROM CTE
WHERE DATEADD(DAY, 1, DT) < =GETDATE()
)
INSERT INTO [dbo].[new_table]
([days_date]
,[weekday])
SELECT DT,DATENAME(DW,DT)
FROM CTE OPTION (maxrecursion 0)
GO
SELECT * FROM new_table
-要解决此问题,请使用选项maxrecursion 0查看。这里有一个完整的例子,介绍了一个包含各种有用列的数字表。但是如果以后需要其他列呢?这里您缺少MAXRECURSION选项,没有它,您无法在该表中添加超过100个值。已经有另一个相同的答案。。请检查之前repost@B3s用户应该知道为什么在这里使用maxrecursion 0选项
CREATE TABLE [dbo].[new_table](
[days_date] [date] NOT NULL,
[weekday] [nvarchar](50) NULL
) ON [PRIMARY]
; WITH CTE (DT) AS
(
SELECT CAST('2014-01-01' AS DATE) DT
UNION ALL
SELECT DATEADD(DAY, 1, DT)
FROM CTE
WHERE DATEADD(DAY, 1, DT) < =GETDATE()
)
INSERT INTO [dbo].[new_table]
([days_date]
,[weekday])
SELECT DT,DATENAME(DW,DT)
FROM CTE OPTION (maxrecursion 0)
GO
SELECT * FROM new_table