2011-05-07 19 views
28

एसक्यूएल में आखिरी बार की अंतिम तिथि कैसे प्राप्त करें? मेरा मतलब है प्रश्न का उपयोग कर अंतिम रविवार की तारीख?एसक्यूएल में पिछले सप्ताह के आखिरी दिन कैसे प्राप्त करें?

http://www.objectreference.net/post/SQL-Find-last-week-date-range.aspx

आप @StartOfPrevWeek चर का उपयोग करना चाहते हैं:

उत्तर

32

वास्तविक DATEFIRST सेटिंग के बावजूद, पिछले रविवार को इस तरह पाया जा सकता है:

SELECT DATEADD(day, 
       -1 - (DATEPART(weekday, GETDATE()) + @@DATEFIRST - 2) % 7, 
       GETDATE() 
      ) AS LastSunday 

बदलें GETDATE() किसी विशेष तिथि से पहले अंतिम रविवार को प्राप्त करने के लिए पैरामीटर @date के साथ।

+0

वाह, मैंने सोचा था कि जब मैं किसी दिए गए दिनांक के बाद अगले शुक्रवार को खोजने के लिए पिछले सप्ताह उस मॉड्यूलस चाल के साथ आया था तो मैं इतना चालाक था। मैं तुम्हें सलाम करता हूँ, महोदय। वहां गैर-गणित geeks के लिए, एंड्री रविवार से शेष राशि का उपयोग कर दिनों की संख्या वापस कर रहा है। मैं एक बड़ा अंगूठे दे रहा हूँ! –

-2
SET @EndDate = GETDATE()-DatePart(dw, GETDATE()); 
+3

यह उचित तिथि वापस नहीं करता है। इसे चलाना अब 4/30 लौटाता है, जो पिछले शनिवार है। – IAmTimCorey

3

यहां ऐसा करने के लिए पर एक बड़ा लेख है।

17

आखरी रविवार (कौन सा "पिछले सप्ताह" का अंत है)

SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6) AS LAST_SUNDAY 

इस सप्ताह (मान लिया जाये कि सोम-रवि सप्ताह स्वरूप)

SELECT DATEADD(wk, DATEDIFF(wk, 7, CURRENT_TIMESTAMP), 7) AS START_OF_WEEK 
SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6 + 7) AS END_OF_WEEK 

परिणाम

START_OF_WEEK 
----------------------- 
2011-05-02 00:00:00.000 

END_OF_WEEK 
----------------------- 
2011-05-08 00:00:00.000 

वूडू समझाने के लिए उदाहरण (उपयोग इस एसक्यूएल ऊपर अपने वांछित शुरू होने वाले सप्ताह के लिए समाप्त हुए सप्ताह के दिन के अनुसार सप्ताह बदल सकते हैं और करने के लिए)

  • उदाहरण नीचे का पता लगाने सप्ताह के दिनों में वर्तमान सप्ताह (रविवार से शनिवार) के भीतर
  • यदि वास्तविक END_OF_WEEK अगले सूर्य-शनि सप्ताह है, तो आपको इस सप्ताह के मूल्य में +7 की आवश्यकता है। (। ऊपर END_OF_WEEK उदाहरण देखें)

एसक्यूएल नीचे

SELECT DATEADD(wk, DATEDIFF(wk, -2, CURRENT_TIMESTAMP), -2) AS DAY_OF_WEEK /* Saturday */ 
SELECT DATEADD(wk, DATEDIFF(wk, -1, CURRENT_TIMESTAMP), -1) AS DAY_OF_WEEK /* Sunday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 0, CURRENT_TIMESTAMP), 0) AS DAY_OF_WEEK /* Monday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 1, CURRENT_TIMESTAMP), 1) AS DAY_OF_WEEK /* Tuesday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 2, CURRENT_TIMESTAMP), 2) AS DAY_OF_WEEK /* Wednesday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 3, CURRENT_TIMESTAMP), 3) AS DAY_OF_WEEK /* Thursday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 4, CURRENT_TIMESTAMP), 4) AS DAY_OF_WEEK /* Friday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 5, CURRENT_TIMESTAMP), 5) AS DAY_OF_WEEK /* Saturday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 6, CURRENT_TIMESTAMP), 6) AS DAY_OF_WEEK /* Sunday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 7, CURRENT_TIMESTAMP), 7) AS DAY_OF_WEEK /* Monday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 8, CURRENT_TIMESTAMP), 8) AS DAY_OF_WEEK /* Tuesday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 9, CURRENT_TIMESTAMP), 9) AS DAY_OF_WEEK /* Wednesday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 10, CURRENT_TIMESTAMP), 10) AS DAY_OF_WEEK /* Thursday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 11, CURRENT_TIMESTAMP), 11) AS DAY_OF_WEEK /* Friday */ 
SELECT DATEADD(wk, DATEDIFF(wk, 12, CURRENT_TIMESTAMP), 12) AS DAY_OF_WEEK /* Saturday */ 
etc... 
0

एसक्यूएल एक उपयुक्त कैलेंडर तालिका के साथ अधिक सरल है। कोई वूडू नहीं

select max(cal_date) end_of_last_week 
from calendar 
where (cal_date < current_date and day_of_week = 'Sun'); 

end_of_last_week 
-- 
2011-05-01 
0
SELECT (DATEADD(DAY, ((DATEPART(dw, @Date) - 1) * -1), @Date)) 
1
DECLARE @LastSunday DATETIME 

-- This will get the previous Sunday with time as 23:59:59 
SELECT @LastSunday = Dateadd(SECOND, -1, Dateadd(WK, Datediff(WK, 6, 
                CURRENT_TIMESTAMP) 
               , 7)) 

SELECT @LastSunday 

-- This gets the monday prior to it and time of 00:00:00 
SELECT Dateadd(SECOND, 1, Dateadd(DAY, -7, @LastSunday)) 
-- This will make you time spans between eg, Monday 16/07/2012 00:00:00 through to Sunday 22/07/2012 23:59:59 
-- Then use them in your WHERE clause like this 
-- SELECT X,Y,Z From SomeTable 
-- WHERE DateField BETWEEN @PreviousMondayToLastSunday AND @LastSunday 
0

इसमें दिए गए दिनांक और समय से आप अगले और कीमती शुक्रवार मिल जाएगा

DECLARE @PREVIOUS int, @dtmStart datetime,@dtmEnd datetime, @NEXT int; 
SET @dtmStart = '12/10/2013'; 
SET @dtmEnd = '12/11/2013'; 

select @PREVIOUS = datepart(dw,@dtmStart) 
WHILE @PREVIOUS <> 6 
BEGIN 
    SET @dtmStart = DATEADD(day , -1 ,@dtmStart) 
    SET @PREVIOUS = datepart(dw,@dtmStart) 
    CONTINUE 
END 
select @dtmStart 

SELECT @NEXT = DATEPART(dw, @dtmEnd) 
    WHILE @NEXT <> 6 
BEGIN 
    SET @dtmEnd = DATEADD(day , 1 ,@dtmEnd) 
    SET @NEXT = datepart(dw,@dtmEnd) 
    CONTINUE 
END 
select @dtmEnd 
1

पिछले रविवार, या आज अगर आज रविवार है पाने के लिए, यह कोशिश

DATEADD(day,- (DATEPART(dw,getdate()) + @@DATEFIRST -1) % 7, getdate()) 
-1

अंतिम शनि की तारीख प्राप्त करने के लिए यहां कोड है ay। यह विधि डेटाबेस की सेटिंग्स से स्वतंत्र है।

declare @lastSaturday date, 
     @today date, 
     @todayName varchar(20); 

select @todayName = datename(weekday, getdate()), @today = getdate(); 

select 
      case @todayName 
       when 'Saturday' then @today 
       when 'Sunday' then dateadd(day,-1,@today) 
       when 'Monday' then dateadd(day,-2,@today) 
       when 'Tuesday' then dateadd(day,-3,@today) 
       when 'Wednesday' then dateadd(day,-4,@today) 
       when 'Thursday' then dateadd(day,-5,@today) 
       when 'Friday' then dateadd(day,-6,@today) 
      end as LastSaturday; 
संबंधित मुद्दे