2014-03-06 82 views
5

我正在使用SQL Server,該場景是查找當天的前一年的當天日期。查找今年的前一年的同一天SQL Server中的日期

假設2014年3月6日是今天的日期和日是週四我想找到當天在以前的謊言在同一個星期。其中的2013年3月7日

能任何身體幫助? 這裏是我所寫的內容:

DECLARE @DateFrom AS DATETIME 
DECLARE @DateTo AS DATETIME 


SET @DateFrom = '2014-01-01' 
SET @DateTo = '2014-02-10' 


DECLARE @Count AS INT 

SET @Count = DATEDIFF(DAY, @DateFrom, @DateTo) 


CREATE TABLE #current_year /*This Year*/ 
(
    [Date] DATETIME , 
    WeekNum INT, 
    [Day] VARCHAR(20), 
    Data INT 
) 
CREATE TABLE #last_year /*This Year -1*/ 
(
    [Date] DATETIME , 
    WeekNum INT, 
    [Day] VARCHAR(20), 
    Data INT 
) 
WHILE (@Count > 0) 
     BEGIN 
      INSERT INTO #current_year 
      VALUES (CONVERT(VARCHAR(10), @DateFrom, 101),       
         DATEPART(week,@DateFrom), 
         DATENAME(weekday, @DateFrom),@Count)   
      INSERT INTO #last_year 
      VALUES (CONVERT(VARCHAR(10), DATEADD(YEAR, -1, @DateFrom), 101),             
         DATEPART(week,DATEADD(YEAR,1,@DateFrom)), 
         DATENAME(weekday, DATEADD(YEAR, -1, @DateFrom)),@Count) 
      SET @DateFrom = DATEADD(day, 1, @DateFrom) 
      SET @Count = @Count - 1 
     END  
     SELECT * from #current_year  
     SELECT * from #last_year 

     SELECT CONVERT(varchar(10),#current_year.[Date],111) AS CYDate, 
       --ISNULL(CONVERT(varchar(10),#last_year.[Date],111) ,/*CONVERT(varchar(10),DateAdd(dd, 1, DATEADD(yy, -1, #current_year.Date)),111)*/) AS LYDate 
       --CONVERT(varchar(10),#last_year.[Date],111) AS LYDate 
       Coalesce(CONVERT(varchar(10),#last_year.[Date],111) ,DateAdd(dd, 1, DATEADD(yy, -1, #current_year.Date))) AS LYDate, 
       #current_year.Data AS CD, 
       #last_year.Data AS LD 
       FROM #current_year        
       --LEFT JOIN #last_year ON #last_year.WeekNum = #current_year.WeekNum 
    --         AND #last_year.[Day] = #current_year.[Day] 
            Left JOIN #last_year ON #last_year.WeekNum = DatePart(wk, GETDATE()) 



DROP TABLE #current_year 
DROP TABLE #last_year 

這裏是輸出:Image

這裏是加入您的解決方案後的輸出,現在在左連接它排除上年

+1

我們怎麼知道任何特定週四是否是我們想要的嗎?即如果今天是'2014-03-07',星期五,我們想要獲得'2013-03-01'還是'2013-03-08'?根據你的定義,可能會有很多邊緣案例,基於幾個月的開始和結束以及可能的閏年可能是一個因素。定義前一年「同一周」的某個特定星期的具體情況。 –

回答

2
的(NULL)數據

嘗試

DECLARE @now Date 
SET @now = '2014-06-03' 
SELECT DATEADD(week, -52, @now) 
1
SELECT DateName(dw, DATEADD(yy, -1, GETDATE())) 

GIV ES Wednesday

SELECT DateName(dw, DateAdd(dd, 1, DATEADD(yy, -1, GETDATE()))) 

Thursday

編輯:

SELECT DateAdd(dd, 1, DATEADD(yy, -1, GETDATE())) 

'2013-03-07 17:30:16.590'

你需要轉換的日期按你的要求..

更新: 改變這一部分有,

Left JOIN #last_year ON #last_year.WeekNum = DatePart(wk, GETDATE()) 

你的情況

Left JOIN #last_year ON DatePart(wk, #last_year.[Date]) = DatePart(wk, #current_year.[Date]) 

更新2:

Left JOIN #last_year ON (MONTH(#last_year.[Date])=MONTH(#current_year.[Date]) and Day(#last_year.[Date])=Day(#current_year.[Date])) 

輸出:

Update output

輸出:

Left JOIN #last_year ON (#last_year.WeekNum = #current_year.WeekNum and #last_year.[Day] = #current_year.[Day]) 

output 2
選擇哪個永遠是你所需的輸出。

+0

我想從這個查詢獲取日期值:** SELECT DateName(dw,DateAdd(dd,1,DATEADD(yy,-1,GETDATE())))** – DareDevil

+0

Buddy它的罰款,因爲它給我正確的日期,但事情是,儘管有日期,但我仍然在同一天顯示數據,而且我已經與源表和應用同等周#和週日的條件一起加入,但它給了我前一週我無法匹配的記錄那些日子。 – DareDevil

+0

我可以發佈我的完整問題陳述嗎?隨着查詢和屏幕截圖? – DareDevil

5

基本上你需要找到在此同一日期和往年之間的天數差,然後由國防部7理解「天差」,而在之前的一年時間總結一下:

DECLARE @now DATETIME 
SET @now = '2014-03-06' 


SELECT CAST (DATEADD(YEAR, -1, @now) + (CAST (@now as INT) - CAST (DATEADD(YEAR, -1, @now) AS INT)) % 7 AS DATE) 

返回

2013-03-07 
+0

但是, ...歸結爲[@Aishvarya Karthik的回答](http://stackoverflow.com/a/22223241/297408)(這是*更*更簡單,更清晰)。 –

0
DECLARE @Date DATE = '2014-03-06' 
SELECT DATEADD(WEEK,-52,@Date) 

Retrun值:

2013年3月7日

相關問題