복붙노트

[SQL] 지난 일요일 찾기

SQL

지난 일요일 찾기

어떻게 SQL 2000에서 한 달의 마지막 일요일을 찾을 것인가?

해결법

  1. ==============================

    1.

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

    편집 : 내 동료에서 수정, 최종 작업 대답.

  2. ==============================

    2.

    select dateadd(day,1-datepart(dw, getdate()), getdate())
    
  3. ==============================

    3.연습 창고 데이터에서 빌려 다른 방법. 날짜 차원 테이블을 만들고 10 년, 또는 정도를 미리로드.

    연습 창고 데이터에서 빌려 다른 방법. 날짜 차원 테이블을 만들고 10 년, 또는 정도를 미리로드.

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

    강제로 할 수있는 dimDate 가장 쉬운 방법은 Excel에서 오후를 보내고 다음 거기에서 DB를 가져 오는 것입니다. 혹시 날짜에 대해 알고 싶어 아무것도 - 반 - 괜찮은 dimDate 테이블은 50 개 이상의 열이 있습니다.

    장소에두고, 문제는 뭔가를 같이된다 :

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

    기본적으로 모든 날짜 관련 쿼리는 간단된다.

  4. ==============================

    4.요일에 관계없이 매일 SQL에서 다음 일요일 : 리턴 2011-01-02 23 : 59 : 59.000 22 12 월 - 2010 년 :

    요일에 관계없이 매일 SQL에서 다음 일요일 : 리턴 2011-01-02 23 : 59 : 59.000 22 12 월 - 2010 년 :

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

    5.나는 이러한 솔루션 중 일부는 하드 그래서 여기에 이해의 단계를 설명하는 변수로 내 버전입니다 찾으십시오.

    나는 이러한 솔루션 중 일부는 하드 그래서 여기에 이해의 단계를 설명하는 변수로 내 버전입니다 찾으십시오.

    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
    
  6. ==============================

    6.

    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)
    
  7. ==============================

    7.어머나,이 못생긴, 그러나 여기 간다 :

    어머나,이 못생긴, 그러나 여기 간다 :

    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)))
    
  8. ==============================

    8.첫 번째는 집계 테이블을 만들었습니다. http://www.sqlservercentral.com/articles/T-SQL/62867/ 당신이 원하는 것을 얻을 ..

    첫 번째는 집계 테이블을 만들었습니다. 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)
    
  9. ==============================

    9.여기에 올바른 방법을 차지하고있어 @@ DATEFIRST

    여기에 올바른 방법을 차지하고있어 @@ DATEFIRST

    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fu_dtLastSundayInMonth]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
    BEGIN
        EXECUTE(N'CREATE FUNCTION [dbo].[fu_dtLastSundayInMonth]() RETURNS int BEGIN RETURN 0 END ')
    END 
    GO 
    
    
    
    /*
    SET DATEFIRST 3; -- Monday
    
    WITH CTE AS (
    
        SELECT 1 AS i, CAST('20190101' AS datetime) AS mydate  
        UNION ALL 
    
        SELECT i+1 AS i, DATEADD(month, 1, CTE.mydate) AS mydate 
        FROM CTE WHERE i < 100 
    )
    
    SELECT -666 AS i, dbo.fu_dtLastSundayInMonth('17530101') AS lastSundayInMonth, dbo.fu_dtLastSundayInMonth('17530101') AS Control 
    
    UNION ALL 
    
    SELECT -666 AS i, dbo.fu_dtLastSundayInMonth('99991231') AS lastSundayInMonth, dbo.fu_dtLastSundayInMonth('99991231') AS Control 
    
    UNION ALL 
    
    SELECT 
         mydate 
        ,dbo.fu_dtLastSundayInMonth(mydate) AS lastSundayInMonth 
        ,dbo.fu_dtLastSundayInMonth(mydate) AS lastSundayInMonth 
        ,DATEADD(day,DATEDIFF(day,'19000107', DATEADD(MONTH, DATEDIFF(MONTH, 0, mydate, 30))/7*7,'19000107') AS Control 
    FROM CTE 
    
    */
    
    
    -- =====================================================================
    -- Description:   Return date of last sunday in month
    --                of the same year and month as @in_DateTime
    -- =====================================================================
    ALTER FUNCTION [dbo].[fu_dtLastSundayInMonth](@in_DateTime datetime )
    RETURNS DateTime
    AS
    BEGIN
        -- Abrunden des Eingabedatums auf 00:00:00 Uhr
        DECLARE @dtReturnValue AS DateTime  
        -- 26.12.9999   SO
        IF @in_DateTime >= CAST('99991201' AS datetime) 
            RETURN CAST('99991226' AS datetime); 
    
        -- @dtReturnValue is now last day of month 
        SET @dtReturnValue = DATEADD 
            (
                 DAY 
                ,-1
                ,DATEADD
                (
                     MONTH
                    ,1
                    ,CAST(CAST(YEAR(@in_DateTime) AS varchar(4)) + RIGHT('00' + CAST(MONTH(@in_DateTime) AS varchar(2)), 2) + '01' AS datetime) 
                )
            )
        ;
    
        -- SET DATEFIRST 1 -- Monday - Super easy ! 
        -- SET DATEFIRST != 1 - PHUK THIS ! 
        SET @dtReturnValue = DATEADD
                            (
                                day
                                ,
                                 -
                                 (
    
                                    (
                                        -- DATEPART(WEEKDAY, @lastDayofMonth) -- with SET DATEFIRST 1 
                                        DATEPART(WEEKDAY, @dtReturnValue) + @@DATEFIRST - 2 % 7 + 1 
                                    )
                                    %7
                                )
                                , @dtReturnValue
        );
    
        RETURN @dtReturnValue; 
    END
    
    
    GO
    
  10. ==============================

    10.

    select next_day(last_day(sysdate)-7, 'Sunday') from dual
    
  11. from https://stackoverflow.com/questions/1794697/find-last-sunday by cc-by-sa and MIT license