SQL列表在两个日期之间重复发生日期,结束日期为下一个开始日期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL列表在两个日期之间重复发生日期,结束日期为下一个开始日期相关的知识,希望对你有一定的参考价值。

我的问题类似于这个Get a list of dates between two dates using a function

使用此代码重复10天:

Declare @startDate datetime
Declare @endDate datetime


set @startDate= '03/01/2019 12:00:00'
set @endDate = '04/30/2019 12:00:00'


 ;WITH mycte AS
(
  SELECT CAST(@startDate AS DATETIME) DateValue
  UNION ALL
  SELECT  DateValue + 10
  FROM    mycte   
  WHERE   DateValue + 10 < @endDate - 1
)

SELECT  DateValue
FROM    mycte
OPTION (MAXRECURSION 0)

我得到了ff结果:

2019-03-20 12:00:00.000
2019-03-30 12:00:00.000
2019-04-09 12:00:00.000
2019-04-19 12:00:00.000

但我希望结果如下:

2019-03-20 12:00:00.000
2019-03-30 12:00:00.000
2019-03-31 12:00:00.000
2019-04-09 12:00:00.000
2019-04-10 12:00:00.000
2019-04-20 12:00:00.000
2019-04-21 12:00:00.000
2019-04-30 12:00:00.000

这可能与SQL有关吗?

答案

我发现问题相当晦涩,但这似乎做你想要的:

set @startDate= '2019-03-10 12:00:00';
set @endDate = '2019-04-30 12:00:00';


WITH mycte AS (
       SELECT CAST(@startDate AS DATETIME) as DateValue
       UNION ALL
       SELECT CONVERT(DATETIME, EOMONTH(DateValue)) + CONVERT(DATETIME, CONVERT(TIME, DateValue))
       FROM  mycte  
       WHERE MONTH(DateValue + 10) <> MONTH(DateValue) AND
             CONVERT(DATE, DATEVALUE) <> CONVERT(DATE, EOMONTH(DateValue)) AND
             DateValue < @endDate
       UNION ALL
       SELECT DateValue + 10
       FROM mycte
       WHERE DateValue + 10 < @endDate
      )
SELECT DISTINCT DateValue
FROM mycte
ORDER BY DateValue
OPTION (MAXRECURSION 0);

Here是一个db <>小提琴。

以上是关于SQL列表在两个日期之间重复发生日期,结束日期为下一个开始日期的主要内容,如果未能解决你的问题,请参考以下文章

如何在 oracle sql 中提取两个日期之间的天数?

如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值

如何在mysql选择查询中获取两个日期之间的日期列表[重复]

创建两个日期之间所有日期的数组或列表[重复]

需要在具有开始和结束日期的选定日期之间按天计算活跃客户列表(也为空)

SQL - 创建两个日期之间的自定义日期列表