2009-11-25 11 views

उत्तर

11
SELECT 
DATEADD(day,DATEDIFF(day,'19000107',DATEADD(month,DATEDIFF(MONTH,0,GETDATE() /*YourValuehere*/),30))/7*7,'19000107') 

संपादित करें: एक सही, अंतिम, काम कर रहे अपने साथी से इस सवाल का जवाब।

0

पवित्र गाय, इस बदसूरत है, लेकिन यहाँ जाता है:

DECLARE @dtDate DATETIME 
SET @dtDate = '2009-11-05' 

SELECT DATEADD(dd, -1*(DATEPART(dw, DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @dtDate)+1, 0)))-1), 
      DateAdd(day, -1, DateAdd(month, DateDiff(month, 0, @dtDate)+1, 0))) 
0

पहले एक टैली टेबल बनाया। http://www.sqlservercentral.com/articles/T-SQL/62867/ तो .. आप क्या चाहते हैं पाने के

http://www.sqlservercentral.com/Forums/Topic515226-1291-1.aspx

DECLARE @DateStart DATETIME, 
     @DateEnd DATETIME 

SELECT @DateStart = '20080131', 
     @DateEnd = '20101201' 

SELECT DATEADD(wk,DATEDIFF(wk,6,DATEADD(mm,DATEDIFF(mm,-1,DATEADD(mm,t.N-1,@DateStart)),-1)),6) 
    FROM dbo.Tally t 
    WHERE t.N <= DATEDIFF(mm,@DateStart,@DateEnd) 
1
DECLARE @LastDateOfMonth smalldatetime 
SELECT @LastDateOfMonth = DATEADD(month, DATEDIFF(month, -1, GETDATE()), 0) -1 
Select DATEADD(dd,-(CASE WHEN DATEPART(weekday,@LastDateOfMonth) = 1 THEN 0 ELSE DATEPART(weekday,@LastDateOfMonth) - 1 END),@LastDateOfMonth) 
+2

अधिकांश गैर-यूएस-अंग्रेज़ी प्रतिष्ठानों में विफल रहता है ... – gbn

2

एक वैकल्पिक दृष्टिकोण डेटा भंडारण अभ्यास से उधार लिया। दिनांक-आयाम तालिका बनाएं और इसे 10 वर्षों के लिए प्री-लोड करें, या तो।

TABLE dimDate (DateKey, FullDate, Day, Month, Year, DayOfWeek, 
       DayInEpoch, MonthName, LastDayInMonthIndicator, many more..) 

सबसे आसान तरीका भरें dimDate को Excel के साथ एक दोपहर बिताने और फिर वहाँ से डीबी को आयात करने के लिए है। आधा सभ्य dimDate तालिका में 50+ कॉलम हैं - जो भी आप किसी तारीख के बारे में जानना चाहते थे।

SELECT max(FullDate) 
FROM dimDate 
WHERE DayOfWeek = 'Sunday' 
     AND Month = 11 
     AND Year = 2009; 

अनिवार्य रूप से, सभी की तारीख संबंधित प्रश्नों आसान हो:

इस के साथ

जगह में, सवाल की तरह कुछ हो जाता है।

-1
select next_day(last_day(sysdate)-7, 'Sunday') from dual 
+0

एसक्यूएल 2000 नहीं मूल प्रश्न जैसा – DasDave

3
select dateadd(day,1-datepart(dw, getdate()), getdate()) 
2
एसक्यूएल में

अगले रविवार, चाहे कोई भी दिन सप्ताह के पहले दिन है: रिटर्न 2011-01-02 23: 59: 59.000 22 दिसम्बर 2010 को:

select DateADD(ss, -1, DATEADD(week, DATEDIFF(week, 0, getdate()), 14)) 
1

मैं इन समाधानों में से कुछ को समझने में कठोर लगता है, इसलिए चरणों को समझाने के लिए चर के साथ मेरा संस्करण यहां है।

ALTER FUNCTION dbo.fn_LastSundayInMonth 
(
    @StartDate DATETIME 
,@RequiredDayOfWeek INT /* 1= Sunday */ 
) 
RETURNS DATETIME 
AS 
/* 
A detailed step by step way to get the answer... 

SELECT dbo.fn_LastSundayInMonth(getdate()-31,1) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,2) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,3) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,4) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,5) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,6) 
SELECT dbo.fn_LastSundayInMonth(getdate()-31,7) 
*/ 
BEGIN 
    DECLARE @MonthsSince1900 INTEGER 
    DECLARE @NextMonth INTEGER 
    DECLARE @DaysToSubtract INTEGER 
    DECLARE @FirstDayOfNextMonth DATETIME 
    DECLARE @LastDayOfMonthDayOfWeek INTEGER 
    DECLARE @LastDayOfMonth DATETIME 
    DECLARE @ReturnValue DATETIME 

    SET @MonthsSince1900=DateDiff(month, 0, @StartDate) 
    SET @[email protected]+1 
    SET @FirstDayOfNextMonth = DateAdd(month,@NextMonth, 0) 
    SET @LastDayOfMonth = DateAdd(day, -1, @FirstDayOfNextMonth) 

    SET @ReturnValue = @LastDayOfMonth 

    WHILE DATEPART(dw, @ReturnValue) <> @RequiredDayOfWeek 
     BEGIN 
      SET @ReturnValue = DATEADD(DAY,-1, @ReturnValue) 
     END 

    RETURN @ReturnValue 
END 
संबंधित मुद्दे