如何在 SQL 查询递归中显示月份的最后一天而不是第一天

问题描述 投票:0回答:1

我有以下疑问:

DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME
 
SET @StartDateTime = '2015-01-01'
SET @EndDateTime = '2016-01-12';
 
WITH DateRange(DateData) AS 
(
    SELECT @StartDateTime as Date
    UNION ALL
    SELECT DATEADD(m,1,DateData)
    FROM DateRange 
    WHERE DateData < @EndDateTime
)
SELECT DateData
FROM DateRange
OPTION (MAXRECURSION 0)

它以以下格式显示该月的第一天:

yyyy-mm-dd hh:mm:ss:mmm

如何更新上面的查询以使其显示:

  • 范围内每个月的最后一天
  • 这种格式:
    MM-dd-yyyy

谢谢。

sql sql-server recursion common-table-expression
1个回答
0
投票

您可以使用

EOMONTH
功能。请注意,您仍然应该从该月的第一天开始递增,否则可能会遇到问题。

DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME
 
SET @StartDateTime = '2015-01-01'
SET @EndDateTime = '2016-01-12';
 
WITH DateRange(DateData) AS 
(
    SELECT EOMONTH(@StartDateTime) as Date, @StartDateTime AS StartOfMonth
    UNION ALL
    SELECT EOMONOTH(DATEADD(m, 1, StartOfMonth))
    FROM DateRange 
    WHERE DateData < @EndDateTime
)
SELECT DateData
FROM DateRange
OPTION (MAXRECURSION 0)

递归很慢。

GENERATE_SERIES
或其他一些数字生成器可能更好。
EOMONTH
还提供了增量参数,这意味着你不需要
DATEADD

DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME
 
SET @StartDateTime = '2015-01-01'
SET @EndDateTime = '2016-01-12';
 
SELECT
  EOMONTH(@StartDateTime, g.value) AS DateData
FROM GENERATE_SERIES(0, DATEDIFF(month, @StartDateTime, @EndDateTime)) g;

格式不应该是相关的,这纯粹是一个显示/演示的事情。但如果您确实需要对日期进行字符串化,则可以使用

CONVERT(varchar(10), yourDate, 110)

© www.soinside.com 2019 - 2024. All rights reserved.