【问题标题】:SQL to return dates that fall in period and rangeSQL返回落在期间和范围内的日期
【发布时间】:2010-03-17 21:37:08
【问题描述】:

我已经为此苦恼了一段时间......我的目标是返回所有介于开始日期和结束日期之间的日期,并且从开始日期开始以特定时间段为因素。 (很难解释)

例如……

开始日期:1987 年 11 月 20 日;结束日期:1988 年 1 月 1 日;周期:10天;

我想要这些日期:1987 年 11 月 20 日; 1987 年 11 月 30 日; 1987年12月10日; 1987年12月20日; 1987 年 12 月 30 日;

我已经有一个日期表,其中包含从 1900 年到 2099 年的所有日期。时间段可以是天、月或年。有任何想法吗?如果您需要更多信息,请告诉我。

MySQL

【问题讨论】:

  • 什么技术?甲骨文、MySQL、SQLServer?

标签: sql mysql date


【解决方案1】:

几天使用 DATEDIFF 和模运算:

SELECT * FROM dates
WHERE `date` BETWEEN '1987-10-20' AND '1988-1-1'
AND DATEDIFF(`date`, '1987-10-20') % 10 = 0

以10年为周期,以年为模,计算年差,并保证月日相同:

SELECT * FROM dates
WHERE `date` BETWEEN '1980-10-20' AND '2000-10-20'
AND MONTH(date) = 10 AND DAY(date) = 20 AND (YEAR(date) - 1980) % 10 = 0

以月为单位的时间段没有明确定义,因为月的长度不同。比 1 月 30 日晚一个月是多少天?您可以让它适用于一些特殊情况,例如“本月第一”。

【讨论】:

    【解决方案2】:

    如果您使用的是 MS SQL Server 2005 或更高版本,则可以使用递归公用表表达式:

    WITH Days AS
    (
        SELECT CONVERT(DATETIME, '11/20/87') AS Date
        UNION ALL
        SELECT DATEADD(DAY, 10, Days.Date) AS Date
        FROM Days
        WHERE Days.Date < '1/1/88'
    )
    SELECT Days.Date
    FROM Days
    WHERE Days.Date < '1/1/88'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 2020-02-28
      • 2014-01-07
      • 1970-01-01
      • 2017-02-13
      相关资源
      最近更新 更多