2015-02-11 40 views
0

所以我試圖在SQL中創建一個日期序列,但是我對腳本有一些限制: 1.它必須以「select」開頭。 2.它不能使用遞歸。 3.它不能使用默認表。如何使用以「select」開頭且不使用缺省表的SQL創建一個日期序列?

原因是它不會在MSSQL中運行,而是在BI工具中運行,它具有類似SQL的語法,但更受限制。

我發現這些解決方案已經:

WITH CTE_DatesTable 
AS 
(
SELECT CAST('2013-05-20' as datetime) AS [date] 
UNION ALL 
SELECT DATEADD(dd, 1, [date]) 
FROM CTE_DatesTable 
WHERE DATEADD(dd, 1, [date]) <= '2016-10-18' 
) 
SELECT date FROM CTE_DatesTable 
OPTION (MAXRECURSION 0); 

這:

select dateadd(day, number, '2014-1-1') 
from 
(select distinct number from master.dbo.spt_values 
where name is null 
) n 
where dateadd(day, number, '2014-1-1') < '2017-1-1' 

但都違反了限制,所以我不能使用它們。我想過使用第二個,並創建一個與「master.dbo.spt_values」中的列「數字」和「名稱」的表,但此腳本將必須具有相同的限制,所以我幾乎回到原來的問題。

+0

「必須從select開始」是什麼意思?如果你使用的是非標準的查詢語言,我們該如何猜測什麼可以或不可以工作? – Anthony 2015-02-11 08:33:06

+0

「必須以選擇開始」意味着商業智能工具(SiSense)不會以任何以其他方式開頭的查詢。 它不是一種不同的語言,只是一個非常有限的常規SQL版本。 我知道這不是很有幫助,但這是我必須工作,對不起。 – AdamQ 2015-02-11 15:20:08

+0

我最常見到的解決方案令人失望,但非常簡單,只需創建一個包含所有日期範圍內可行需求的表格即可。對於32位Unix時間範圍(1970-2038)中的所有日期,該表將具有約25,000行。 – Anthony 2015-02-11 17:05:44

回答

0

您可以嘗試使用日期列表生成一個表格,然後使用如下所示的循環邏輯從該表格中選擇所有值。

聲明@date = 'YYYY-MM-DD' 日期

創建表#TEMP(DATE_SEQ日期)

而@date < = 'YYYY-MM-DD'

插入到#TEMP值(@date)

@date = DATE_ADD(DD,1,@date)

select * from #temp

相關問題