2017-02-21 74 views
-1

我正在尋找一些應該選擇「1月份的最後一個星期日」的T-SQL代碼。T-SQL autopickup date

例如:假設,

塞納里奧1:當前日期是 - '2017年1月29日'

  • 代碼應該選擇 - 「2016年1月31日'

Senario 2:當前日期是 - '2017-02-05'

  • 代碼應該選擇 - '2017年1月29日'

塞納里奧3:當前日期是 - '2017年2月19日'

  • 代碼應該選擇 - ' 2017年1月29' 日

塞納里奧4:當前日期是 - '2018年1月28日'

  • 代碼應該選擇 - '2017年1月29日'

塞納里奧5:當前日期是 - '2018年2月4日'

  • 代碼應該選擇 - ' 2018' 年1月28日

請注意:這是因爲年從L-開始ast一月份的星期天

我在SQL Server 2014中使用了一些T-SQL代碼。它總是選擇每年1月31日 - 這是錯誤的。

select CASE 
    WHEN GETDATE() <= DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01')) 
    THEN DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE())-1)) + '-02-01')) 
    ELSE DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01')) 
END 

爲什麼總是選擇1月31日?

回答

0

您可以使用下面的SQL查詢來從給定的日期

DECLARE @dtDate DATETIME 
SET @dtDate = '2/21/2017' 

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0)) 

輸出得到的最後日期:2017-02-28 23:59:59.000

SELECT FORMAT(DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0)), 'yyyy-MM-dd') AS LastDate 

輸出:2017-02-28

+0

所需的輸出是最後一個星期日月份一個月,而不是當前日期的最後一個星期日。 –

+0

@ b-balamanigandan對不起,無法正常工作 – user2331670

0

下面的T-SQL提供了你需要的結果。

Declare @dtMyDate datetime 

select @dtMyDate = '2017-01-25' 

select case 
     when datepart(month,@dtMyDate) = 1 

     then convert(varchar(10), DATEADD(day,DATEDIFF(day,'19000107', 
     DATEADD(month,DATEDIFF(MONTH,0, 
     CONVERT(date, CONVERT(VARCHAR(4), dateadd(year,-1,@dtMyDate), 112)+'0101')),30))/7*7,'19000107'), 120) 

     else convert(varchar(10), DATEADD(day,DATEDIFF(day,'19000107', 
     DATEADD(month,DATEDIFF(MONTH,0, 
     CONVERT(date, CONVERT(VARCHAR(4), @dtMyDate, 112)+'0101')),30))/7*7,'19000107'), 120) 
     end 

結果: -

2016-01-31 

的參考,可以幫助我: -

how to extract current year and combine with specific month and date as a date

Find Last Sunday

+0

對不起,不能正常工作 – user2331670

+0

謝謝(如果日期是在二月至十二月之間,它會給出正確的答案)。但是如果我們將當前日期設置爲'2017-01-25'(或1月份的任何其他日期),那麼結果是錯誤的。對於上述日期(2017-01-25)答案應該是'2016-01-31' – user2331670

+0

@ user2331670,答案已更新。 –

0
DECLARE @LastJanuarySunday DATE = CONVERT(DATE,CAST((SELECT DATEPART(YEAR, GETDATE())) AS VARCHAR(4)) + '-01-01') 
DECLARE @LastDay DATE = 
(SELECT DATEADD(dd,-(DATEPART(WEEKday, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,convert(datetime,@LastJanuarySunday,112))+1,0)))-1),DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,convert(datetime,@LastJanuarySunday,112))+1,0)))) 
DECLARE @InputDate DATE = GETDATE() 


SELECT CASE WHEN @InputDate > @LastDay AND @LastJanuarySunday <> @LastDay 
    THEN @LastDay 
    WHEN @InputDate = @LastDay 
    THEN DATEADD(DAY, 2, @LastDay) 
    END 

這對你有用。

+0

感謝它工作正常(如果日期在二月至十二月間)。但如果我們將當前日期設置爲'2017-01-25'(或1月份的任何其他日期),則結果爲空。請幫忙嗎? – user2331670

0

這個的最右邊一列將計算任何日期在1月份的上一個星期日。我已經將其他欄目作爲一種簡單的方式來記錄和實驗邏輯。

沒有分支邏輯,它都是純日期數學,所以它應該合理快速地進行聚合,並且應該能夠在日期列上使用索引。

DECLARE @Date DATE = '20170205'; 
SELECT SampleDate= @Date , 
    EndOfSampleMonth = EOMONTH(@Date) , 
    SampleMonthNumber = DATEPART(MONTH,@Date) , 
    MostRecentJanuaryForSampleMonth = DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date) , 
    LastDayOfMostRecentJanuary = EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)) , 
    WeekDayOfLastDayOfMostRecentJanuary = DATEPART(WEEKDAY,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date))) , 
    LastSundayOfJanuary = DATEADD(DAY,(DATEPART(WEEKDAY,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))-1)*-1,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date))) , 
    LastSundayOfJanuaryDayOfYear= DATEPART(DAYOFYEAR,DATEADD(DAY,(DATEPART(WEEKDAY,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))-1)*-1,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))) , 
    PushSampleDateToFiscalYear = DATEADD(DAY,(DATEPART(DAYOFYEAR,DATEADD(DAY,(DATEPART(WEEKDAY,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))-1)*-1,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date))))) * -1 ,@date) , 
    PreviousLastSundayInJanuaryForSampleDate = DATEADD(DAY,(DATEPART(WEEKDAY,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH 
,DATEADD(DAY,((DATEPART(DAYOFYEAR,DATEADD(DAY,(DATEPART(WEEKDAY,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))-1)*-1,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))))-1) * -1 ,@Date))-1)*-1 
,DATEADD(DAY,((DATEPART(DAYOFYEAR,DATEADD(DAY,(DATEPART(WEEKDAY,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))-1)*-1,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))))-1) * -1 ,@Date))))-1)*-1,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH 
,DATEADD(DAY,((DATEPART(DAYOFYEAR,DATEADD(DAY,(DATEPART(WEEKDAY,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))-1)*-1,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))))-1) * -1 ,@Date))-1)*-1 
,DATEADD(DAY,((DATEPART(DAYOFYEAR,DATEADD(DAY,(DATEPART(WEEKDAY,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))-1)*-1,EOMONTH(DATEADD(MONTH,(DATEPART(MONTH,@Date)-1)*-1,@Date)))))-1) * -1 ,@Date)))) 

如果你被一個財政年度試圖組,在今年()函數來輸出包PushSampleDatetoFiscalYear本財年的日期所屬。要將其用於表格,請將@Date替換爲您自己的日期字段。

更新與樣品結果:

SampleDate PreviousLastSundayInJanuaryForSampleDate 
2008-06-03 2008-01-27 
2008-12-20 2008-01-27 
2009-07-08 2009-01-25 
2010-01-24 2009-01-25 
2010-08-12 2010-01-31 
2011-02-28 2011-01-30 
2011-09-16 2011-01-30 
2012-04-03 2012-01-29 
2012-10-20 2012-01-29 
2013-05-08 2013-01-27 
2013-11-24 2013-01-27 
2014-06-12 2014-01-26 
2014-12-29 2014-01-26 
2015-07-17 2015-01-25 
2016-02-02 2016-01-31 
2016-08-20 2016-01-31 
2017-03-08 2017-01-29 
2017-09-24 2017-01-29 
2018-04-12 2018-01-28 
2018-10-29 2018-01-28 
2019-05-17 2019-01-27 
2019-12-03 2019-01-27 
2020-06-20 2020-01-26