2017-06-07 143 views
0

我想將Oracle查詢中的一些代碼行轉換爲MSSQL。如何在沒有臨時表的SQL中生成日期範圍序列

WITH DATE_MONTHS AS 
(
    SELECT TO_CHAR(ADD_MONTHS(TO_DATE(TRUNC(TO_DATE(P_REQUIRED_DATE),'MON')), - LEVEL 
    +1),'DD-MON-YYYY') MONTHS FROM DUAL 
    CONNECT BY LEVEL <= P_MONTH_RANG 
) 
SELECT * from DATE_MONTHS 

參數:

  • P_REQUIRED_DATE即SYSDATE
  • P_MONTH_RANG即4

結果:

  • 2017年1月5日
  • 2017年1月4日
  • 2017年1月3日
  • 2017年1月2日

回答

3

一種簡單的方法是使用符合表和產生象下面這樣:

declare @P_Required_Date date = '2015-05-01' 
declare @P_Month_Rang int = 4 

Select top (@P_Month_Rang) Dts = DateAdd(month, -(Row_Number() over(order by (Select NULL))-1), @P_Required_Date) from 
     master..spt_values s1, master..spt_values s2 

輸出作爲如下:

+------------+ 
    | Dts  | 
    +------------+ 
    | 2015-05-01 | 
    | 2015-04-01 | 
    | 2015-03-01 | 
    | 2015-02-01 | 
    +------------+ 

你的CTE的方法:

declare @P_Required_Date date = '2015-05-01' 
declare @P_Month_Rang int = 4 

;with Date_Months as 
(
    Select @P_Required_Date as Dates, 1 as Levl 

    Union all 

    Select DateAdd(MONTH,-1, Dates), Levl+1 as Levl from Date_Months 
     where Levl < @P_Month_Rang 
) 
Select convert(varchar(10), dates, 103) from Date_Months 

要轉換爲您的dd-mm-yyyy格式,一種方法是使用選項103進行轉換或使用格式。

+0

可能希望顯示怎麼辦DD -MM-YYYY格式,如指定在這個問題中......知道的也很有用。 – pmbAustin

+0

用正確的格式更新了答案 –

+0

@KannanKandasamy很棒。感謝 – SAL

1

使用堆疊CTE的另一種選擇

declare @fromdate date = '20150501'; 
declare @months int = 4; 

;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)) 
, dates as (
    select top (@months) 
     [Date]=convert(date,dateadd(month,-(row_number() over(order by (select 1))-1),@fromdate)) 
    from n as deka cross join n as hecto cross join n as kilo cross join n as tenK 
    order by [Date] desc 
) 
select [Date] = convert(char(10),[date],105) 
from dates; 

rextester演示:http://rextester.com/UUW2271

回報:

+------------+ 
| Date | 
+------------+ 
| 01-05-2015 | 
| 01-04-2015 | 
| 01-03-2015 | 
| 01-02-2015 | 
+------------+ 

基準&性能測試:Generate a set or sequence without loops - 2 - Aaron Bertrand

+0

不錯的文章,以更多地瞭解不同的方式。謝謝 – SAL

+0

@SAL樂意幫忙! – SqlZim