2010-03-17 67 views
3

我一直在研究这一段时间......我的目标是返回落在开始和结束日期之间的所有日期,并将某个时间段作为因子,从开始日期开始。 (很难解释)SQL返回期间和范围内的日期

例如...

开始日期: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的

+0

哪个数据库? – 2010-03-17 21:39:38

+0

有什么技术? Oracle,MySQL,SQLServer? – northpole 2010-03-17 21:40:28

回答

7

对于天使用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日晚一个月?你可以在一些特殊情况下工作,比如“本月第一”。

+0

对于天来说,这真的很棒,谢谢。几个月呢? – Nate 2010-03-17 21:48:48

+0

谢谢先生。很有帮助! – Nate 2010-03-17 22:38:36

1

如果您正在使用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'