2010-03-17 132 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'