我需要在SQL中顯示日期列表。我已經有一個單行輸入的n數字代碼。顯示SQL中開始和結束日期的日期列表
當前表結構(日/月/年格式的日期):
Code FromDate ToDate Total Days
1 01/03/2012 04/03/2012 4
2 01/04/2012 05/04/2012 5
我需要輸出爲:
Code FromDate
1 01/03/2012
1 02/03/2012
1 03/03/2012
1 04/03/2012
我需要在SQL中顯示日期列表。我已經有一個單行輸入的n數字代碼。顯示SQL中開始和結束日期的日期列表
當前表結構(日/月/年格式的日期):
Code FromDate ToDate Total Days
1 01/03/2012 04/03/2012 4
2 01/04/2012 05/04/2012 5
我需要輸出爲:
Code FromDate
1 01/03/2012
1 02/03/2012
1 03/03/2012
1 04/03/2012
WITH date_range (calc_date) AS (
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, '2010-01-13') - DATEDIFF(DAY, '2010-01-01', '2010-01-13'), 0)
UNION ALL SELECT DATEADD(DAY, 1, calc_date)
FROM date_range
WHERE DATEADD(DAY, 1, calc_date) <= '2010-01-13')
SELECT calc_date
FROM date_range;
雖然你推斷的可以寫代碼日期(如VikramJain的recursive CTE SQL Server)它的CPU很重。如果您有大量記錄,並且時間跨度很大,那麼您將迭代地構建大量數據。每當你查詢你的數據時你都會這樣做。到目前爲止,最高效率的方法就是創建另一個表。
如果您根據維度表和事實表考慮數據庫,則開始日期和結束日期只是隱含維度Time
的關鍵。而不是隱含的,明確的,並創建一個Calendar
表。然後它是微不足道的...
SELECT
yourTable.code,
calendar.calendar_date
FROM
yourTable
INNER JOIN
calendar
ON calendar.calendar_date >= yourTable.fromDate
AND calendar.calendar_date < yourTable.toDate
這可能會節省大量的CPU負載,並大大簡化您的查詢。
一旦你有了表格,預填充日期涵蓋了你將需要的一切,許多雜亂的日期操作變成簡單的可索引查找。
你甚至可以添加到該表的元數據,如...
有的人批評這不雅。我個人覺得正好相反:
- 它緩存基於凌亂的日期計算
- 它明確地創建一個維表
它甚至使用Teradata的非常良好的效果:sys_calendar.calendar
。
使用循環或日期查找表,或者只是在前端執行。你做了什麼沒有奏效? –
你有沒有嘗試過自己?你使用的是什麼數據庫引擎?是不是'總天數'是多餘的? –
你可以爲此寫一個程序。 – Suranga