Find last sunday

前端 未结 10 1268
余生分开走
余生分开走 2020-12-05 20:40

How will you find last sunday of a month in sql 2000?

相关标签:
10条回答
  • 2020-12-05 20:56

    Next sunday in SQL, regardless which day is first day of week: returns 2011-01-02 23:59:59.000 on 22-dec-2010:

    select DateADD(ss, -1, DATEADD(week, DATEDIFF(week, 0, getdate()), 14))
    
    0 讨论(0)
  • 2020-12-05 20:58
    select next_day(last_day(sysdate)-7, 'Sunday') from dual
    
    0 讨论(0)
  • 2020-12-05 21:01
    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)
    
    0 讨论(0)
  • 2020-12-05 21:02

    An alternative approach, borrowed from data warehousing practice. Create a date-dimension table and pre-load it for 10 years, or so.

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

    The easiest way to fill-in the dimDate is to spend an afternoon with Excel and then import to DB from there. A half-decent dimDate table has 50+ columns -- anything you ever wanted to know about a date.

    With this in place, the question becomes something like:

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

    Essentially, all date related queries become simpler.

    0 讨论(0)
  • 2020-12-05 21:02

    I find some of these solutions hard to understand so here's my version with variables to explain the steps.

    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 @NextMonth=@MonthsSince1900+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
    
    0 讨论(0)
  • 2020-12-05 21:08
    SELECT
     DATEADD(day,DATEDIFF(day,'19000107',DATEADD(month,DATEDIFF(MONTH,0,GETDATE() /*YourValuehere*/),30))/7*7,'19000107')
    

    Edit: A correct, final, working answer from my colleague.

    0 讨论(0)
提交回复
热议问题