在 SQL Server 中自动填充 CTE

发布于 2024-10-08 14:59:49 字数 141 浏览 0 评论 0原文

如何自动填充 CTE 以包含每月的第一天 例如:

2010 年 1 月 1 日
2010年2月1日
2010年3月1日
2010年4月1日

等等。我正在寻找一个查询来执行此操作,而不是使用 UNION 运算符。

How can I auto populate a CTE to contain the first day of every month
Eg:

1-1-2010
2-1-2010
3-1-2010
4-1-2010

and so on. I looking for a query to do so, rather than using UNION operator.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

顾挽 2024-10-15 14:59:49

看一下

DECLARE @StartDate DATETIME,
        @EndDate DATETIME

SELECT  @StartDate = '01 Jan 2010',
        @EndDate = '01 Jan 2011'

;WITH Dates AS (
        SELECT  @StartDate StartOfMonth
        UNION ALL
        SELECT DATEADD(month,1,StartOfMonth) StartOfMonth
        FROM    Dates
        WHERE   DATEADD(month,1,StartOfMonth) <= @EndDate
)
SELECT  *
FROM    Dates

OUTPUT

StartOfMonth
-----------------------
2010-01-01 00:00:00.000
2010-02-01 00:00:00.000
2010-03-01 00:00:00.000
2010-04-01 00:00:00.000
2010-05-01 00:00:00.000
2010-06-01 00:00:00.000
2010-07-01 00:00:00.000
2010-08-01 00:00:00.000
2010-09-01 00:00:00.000
2010-10-01 00:00:00.000
2010-11-01 00:00:00.000
2010-12-01 00:00:00.000
2011-01-01 00:00:00.000

EDIT

之类的内容,并提供了列名称

DECLARE @StartDate DATETIME,
        @EndDate DATETIME

SELECT  @StartDate = '01 Jan 2010',
        @EndDate = '01 Jan 2011'

;WITH Dates (dt) AS (
        SELECT  @StartDate dt
        UNION ALL
        SELECT DATEADD(month,1,dt) dt
        FROM    Dates
        WHERE   DATEADD(month,1,dt) <= @EndDate
)
SELECT  *
FROM    Dates

Have a look at something like

DECLARE @StartDate DATETIME,
        @EndDate DATETIME

SELECT  @StartDate = '01 Jan 2010',
        @EndDate = '01 Jan 2011'

;WITH Dates AS (
        SELECT  @StartDate StartOfMonth
        UNION ALL
        SELECT DATEADD(month,1,StartOfMonth) StartOfMonth
        FROM    Dates
        WHERE   DATEADD(month,1,StartOfMonth) <= @EndDate
)
SELECT  *
FROM    Dates

OUTPUT

StartOfMonth
-----------------------
2010-01-01 00:00:00.000
2010-02-01 00:00:00.000
2010-03-01 00:00:00.000
2010-04-01 00:00:00.000
2010-05-01 00:00:00.000
2010-06-01 00:00:00.000
2010-07-01 00:00:00.000
2010-08-01 00:00:00.000
2010-09-01 00:00:00.000
2010-10-01 00:00:00.000
2010-11-01 00:00:00.000
2010-12-01 00:00:00.000
2011-01-01 00:00:00.000

EDIT

With column name supplied

DECLARE @StartDate DATETIME,
        @EndDate DATETIME

SELECT  @StartDate = '01 Jan 2010',
        @EndDate = '01 Jan 2011'

;WITH Dates (dt) AS (
        SELECT  @StartDate dt
        UNION ALL
        SELECT DATEADD(month,1,dt) dt
        FROM    Dates
        WHERE   DATEADD(month,1,dt) <= @EndDate
)
SELECT  *
FROM    Dates
め七分饶幸 2024-10-15 14:59:49
WITH CTEDates AS
(
SELECT CAST('20100101' AS DATETIME) AS DateVal
UNION ALL
SELECT DATEADD(mm, 1, DateVal)
FROM CTEDates
WHERE DateVal < '20101201'
)

SELECT * FROM CTEDates
WITH CTEDates AS
(
SELECT CAST('20100101' AS DATETIME) AS DateVal
UNION ALL
SELECT DATEADD(mm, 1, DateVal)
FROM CTEDates
WHERE DateVal < '20101201'
)

SELECT * FROM CTEDates
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文