-2
CREATE TABLE #DaysTable(tdays datetime)
    -- SET NOCOUNT ON added to prevent extra result sets from

    -- interfering with SELECT statements.
    SET NOCOUNT ON;

WITH

CTE_Days AS

(

SELECT DATEADD(month, @month, DATEADD(month, -MONTH(@dataforDate), DATEADD(day, -DAY(@dataforDate) + 1, CAST(FLOOR(CAST(@dataforDate AS FLOAT)) AS DATETIME)))) Days

UNION ALL

SELECT DATEADD(day, 1, Days)

FROM CTE_Days

WHERE Days < DATEADD(day, -1, DATEADD(month, 1, DATEADD(month, @month, DATEADD(month, -MONTH(@dataforDate), DATEADD(day, -DAY(@dataforDate) + 1, CAST(FLOOR(CAST(@dataforDate AS FLOAT)) AS DATETIME))))))

)

insert into #dayatable
select * from
    (
SELECT DATEADD(month, @month, DATEADD(month, -MONTH(@dataforDate), DATEADD(day, -DAY(@dataforDate) + 1, CAST(FLOOR(CAST(@dataforDate AS FLOAT)) AS DATETIME)))) Days

UNION ALL

SELECT DATEADD(day, 1, Days)

FROM CTE_Days

WHERE Days < DATEADD(day, -1, DATEADD(month, 1, DATEADD(month, @month, DATEADD(month, -MONTH(@dataforDate), DATEADD(day, -DAY(@dataforDate) + 1, CAST(FLOOR(CAST(@dataforDate AS FLOAT)) AS DATETIME))))))
)

但这给了我错误。

4

2 回答 2

1

如果我错了,请纠正我,您在插入到 CTE 中已经存在的语句之后重复了相同的条件,如果是这种情况,那么您可以简单地编写如下:

WITH CTE_Days AS
(
SELECT DATEADD(month, @month, DATEADD(month, -MONTH(@dataforDate), DATEADD(day, -DAY(@dataforDate) + 1, CAST(FLOOR(CAST(@dataforDate AS FLOAT)) AS DATETIME)))) Days
UNION ALL
SELECT DATEADD(day, 1, Days)
FROM CTE_Days
WHERE Days < DATEADD(day, -1, DATEADD(month, 1, DATEADD(month, @month, DATEADD(month, -MONTH(@dataforDate), DATEADD(day, -DAY(@dataforDate) + 1, CAST(FLOOR(CAST(@dataforDate AS FLOAT)) AS DATETIME))))))
)
insert into #DaysTable
select * from CTE_Days;
于 2013-11-07T10:36:09.397 回答
0
  • 每个选择、插入、更新或删除都是一个单独的语句。
  • 所以每个人都需要CTE表达式。
  • 只有第一个有。
于 2013-11-07T10:05:35.243 回答