복붙노트

[SQL] SQL 서버 : 날짜 범위를 계산

SQL

SQL 서버 : 날짜 범위를 계산

나는 현재 날짜 (전년 대비)이 월 (전년 대비)의 시작 부분에서 날짜 범위를 얻기 위해 노력하고있어. 이 코드를 단순화 할 수있는 방법이 있습니까?

SELECT 'From the beginning of month to this day, previous year' AS Label,
       CONVERT (DATETIME, CAST (DATEPART(YY, GETDATE()) - 1 AS CHAR (4)) + CASE 
                                                                           WHEN DATEPART(MM, GETDATE()) < 10 THEN '-0' + CAST (DATEPART(MM, GETDATE()) AS CHAR (1)) ELSE '-' + CAST (DATEPART(MM, GETDATE()) AS CHAR (2)) 
                                                                           END + '-01') AS Begin_date,
       CONVERT (DATETIME, CAST (DATEPART(YY, GETDATE()) - 1 AS CHAR (4)) + CASE 
                                                                           WHEN DATEPART(MM, GETDATE()) < 10 THEN '-0' + CAST (DATEPART(MM, GETDATE()) AS CHAR (1)) ELSE '-' + CAST (DATEPART(MM, GETDATE()) AS CHAR (2)) 
                                                                           END + CASE 
                                                                                 WHEN DATEPART(DD, GETDATE()) < 10 THEN '-0' + CAST (DATEPART(DD, GETDATE()) AS CHAR (1)) ELSE '-' + CAST (DATEPART(DD, GETDATE()) AS CHAR (2)) 
                                                                                 END) AS End_date

해결법

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

    1.

    SELECT  'Anything' as Label
            ,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) as firstdaythismonth
            ,DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) as today
            ,DATEADD(year, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)) as firstdaythismonth_lastyear
            ,DATEADD(year, -1, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) as today_lastyear
    
  2. ==============================

    2.

    SELECT 
         DATEADD(yy, -1, CONVERT(VARCHAR(25),
         DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()),101)) AS Date_Value,
         'First Day of Current Month Of Last Year' AS Date_Type
    UNION
    SELECT 
         DATEADD(yy, -1, GETDATE()) AS TodayLastYear, 'Today Last Year'
    

    또는 당신은 단지 값없이 설명을 원하는 경우

    SELECT 
         DATEADD(yy, -1, CONVERT(VARCHAR(25),
         DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()),101))
    UNION
    SELECT 
         DATEADD(yy, -1, GETDATE()) AS TodayLastYear
    

    당신은 DATEADD를 사용하고 빼기 년에 전년 동기 대비 지정합니다. 그냥 음의 값을 사용합니다.

    나는 또한 내가 사용하는 일반적인 날짜 함수의 집합을 공유 할 수 있습니다. 그냥 테이블 반환 함수로이 작성 :

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    
    CREATE FUNCTION [dbo].[udfCommonDates] (@date datetime)
    RETURNS @t table (week_start datetime,
                      week_end datetime,
                      lastweek_start datetime,
                      lastweek_end datetime,
                      month_start datetime,
                      month_end datetime,
                      lastmonth_start datetime,
                      lastmonth_end datetime,
                      yesterday_start datetime,
                      yesterday_end datetime,
                      today_start datetime,
                      today_end datetime,
                      thisweek_monday_start datetime,
                      thisweek_monday_end datetime,
                      year_start datetime,
                      year_end datetime,
                      tomorrow_noon datetime,
                      today_noon datetime,
                      date_only datetime)
    BEGIN
       INSERT @t
       SELECT
       dbo.get_week_start ( @date ) AS week_start,
       dbo.get_week_end   ( @date ) AS week_end,
       dbo.get_week_start ( DATEADD(d, -7, @date ) ) AS lastweek_start,
       dbo.get_week_end   ( DATEADD(d, -7, @date ) ) AS lastweek_end,
       dbo.get_month_start( @date ) AS month_start,
       dbo.get_month_end  ( @date ) AS month_end,
       dbo.get_month_start ( DATEADD(m,-1, @date) ) AS lastmonth_start,
       dbo.get_month_end  ( DATEADD(m,-1,@date) ) AS lastmonth_end,
       dbo.get_yesterday_start ( @date ) AS yesterday_start,
       dbo.get_yesterday_end ( @date ) AS yesterday_end,
       dbo.get_today_start (@date) AS today_start,
       dbo.get_today_end ( @date ) AS today_end,
       dbo.get_weekday_start(1,@date) AS thisweek_monday_start,
       dbo.get_weekday_end(1,@date) AS thisweek_monday_end,
       dbo.get_year_start(@date) AS year_start,
       dbo.get_year_end(@date) AS year_end,  
       dbo.get_tomorrow_noon(@date) AS TomorrowNoon,
       dbo.get_today_noon(@date) AS TodayNoon,
       dbo.get_date_only(@date) AS DateOnly
    RETURN
    END
    

    여기에 이들에 대한 스칼라 값 함수는 다음과 같습니다

        CREATE FUNCTION [dbo].[get_date_only] (@date datetime)
        RETURNS datetime
        WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
        AS    
        BEGIN
            RETURN dateadd(day, DateDiff(day, 0, GetDate()), 0)
        END
        GO
    
    CREATE FUNCTION [dbo].[get_month_end] (@date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    
    BEGIN
       RETURN dateadd(ms, -3, dateadd (m,datediff(m,0,
              dateadd(m,1,@date)),0))
    END
    GO
    
    CREATE FUNCTION [dbo].[get_month_start] (@date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    
    BEGIN
       RETURN dateadd(m,datediff(m,0, @date),0)
       END
    GO
    
    CREATE FUNCTION [dbo].[get_today_end] (@today datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    
    BEGIN
       return dateadd(ms, -3, datediff(d,0,dateadd(d,1,@today)))
    END
    GO
    
    CREATE FUNCTION [dbo].[get_today_noon](@date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       RETURN DATEADD(hh, 12, DATEADD(d,DATEDIFF(d,0, @date),0))
    END
    GO
    
    CREATE FUNCTION [dbo].[get_today_start] (@today datetime)
    RETURNS datetime 
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       return dateadd(day, 0, datediff(d,0,@today))
    END
    GO
    
    CREATE FUNCTION [dbo].[get_tomorrow_noon](@date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       RETURN DATEADD(hh, 12, DATEADD(d,DATEDIFF(d,-1, @date),0))
    END
    GO
    
    CREATE FUNCTION [dbo].[get_week_end] (@date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       return dateadd(yyyy, datepart(yyyy,
          dateadd(weekday,7-datepart(weekday, @date),@date))-1900, 0)
        + dateadd(ms, -3,
          dateadd(dy, datepart(dy,
         dateadd(weekday,7-datepart(weekday, @date),@date)),0) )
    END
    GO
    
    CREATE FUNCTION [dbo].[get_week_start] (@date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       return dateadd(yyyy, datepart(yyyy,
          dateadd(weekday,1-datepart(weekday, @date),@date))-1900, 0)
        + dateadd(dy, datepart(dy,
          dateadd(weekday,1-datepart(weekday, @date),@date))-1,0)
    END
    GO
    
    CREATE FUNCTION [dbo].[get_weekday_end] (@weekday tinyint,
                                     @date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       return dateadd(yyyy, datepart(yyyy,
          dateadd(weekday,@weekday-
          datepart(weekday, @date),@date))-1900, 0)
        + dateadd(ms, -3,
          dateadd(dy, datepart(dy,
          dateadd(weekday,@weekday-datepart(weekday, @date),
                                            @date)),0) )
    END
    GO
    
    CREATE FUNCTION [dbo].[get_weekday_start] (@weekday tinyint,
                                       @date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       return dateadd(yyyy, datepart(yyyy,
          dateadd(weekday,@weekday-
          datepart(weekday, @date),@date))-1900, 0)
        + dateadd(dy, datepart(dy,
          dateadd(weekday,@weekday-datepart(weekday, @date),
                                            @date))-1,0)
    END
    GO
    
    CREATE FUNCTION [dbo].[get_year_end] (@date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
    RETURN DATEADD(year, DATEDIFF(year, 0, GetDate())+1, 0)-1
    END
    GO
    
    CREATE FUNCTION [dbo].[get_year_start] (@date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       RETURN DATEADD(year,DATEDIFF(year,0, @date),0)
    END
    GO
    
    CREATE FUNCTION [dbo].[get_yesterday_end] (@today datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       return dateadd(ms, -3, datediff(d,0,@today))
    END
    GO
    
    CREATE FUNCTION [dbo].[get_yesterday_start] (@today datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    BEGIN
       RETURN dateadd(day, -1, datediff(d,0,@today))
    END
    GO
    

    내가 날짜 매개 변수에 대한 서비스를보고이 사용하기 때문에이 나를 ​​위해 정말 도움이되었다. 당신은 단순히이 테이블 함수를 참조하는 데이터 집합을 만든 다음 RS 내의 모든 날짜의 매개 변수에 다음을 사용할 수 있습니다.

    당신과 같이이 전체 테이블 반환 함수를 실행할 수 있습니다 :

    SELECT [보기 MyDB] * FROM. DBO]. udfCommonDates (에 GetDate ())

    결과는 매우 비슷

    지금은 이전에 내가보고 서비스를 위해 이러한 사용을 언급했다. 이제 RS의 사람들은 생각 될 수 있지만 나는 데이터 집합을 필요로하고 데이터 집합 만 저장 프로 시저 또는 직접 테이블을 기반으로 할 수있는 도움말을 나를 어떻게하는지. 어떤 문제는 다음과 같은 저장 프로 시저를 만들 수 없습니다 :

    CREATE PROCEDURE [dbo].[uspCommonDates] AS
    begin
       set datefirst 1
       declare @date datetime
       set @date = getdate()
       select * from dbo.udfCommonDates(@date)
    end
    

    이제 서비스가 새로운 데이터 세트를 추가보고 지금 ... 데이터 세트로 사용하는 저장 프로 시저를 가지고 :

    이제 보고서의 보고서 매개 변수 섹션으로 이동 :

    이제 데이터 세트 dsFunctions을 선택 (또는 당신이 그것을라고 무엇이든) 다음과 같은 라 함수의 값 필드 중 하나를 선택 :

    보고서를 실행할 때 이제 스칼라를 사용합니다 :

  3. ==============================

    3.당신은 도움이되는 DATEADD 함수를 사용할 수 있습니다 :

    당신은 도움이되는 DATEADD 함수를 사용할 수 있습니다 :

     SELECT 'From the beginning of month to this day, previous year' AS Label,
    DATEADD(YY,-1,DATEADD(DD,-(day(getdate())-1),DATEDIFF(dd, 0, GETDATE()))) AS Begin_date,
    DATEADD(YY,-1,DATEDIFF(dd, 0, GETDATE()))  AS End_date
    
  4. ==============================

    4.2010-04-01의 경우, 약 2010-04-04 방법;

    2010-04-01의 경우, 약 2010-04-04 방법;

    SELECT 
    CAST(DATEADD(DAY, -365 + -(DAY(GETDATE())-1), GETDATE()) AS DATE), 
    CAST(DATEADD(YEAR, -1, GETDATE()) AS DATE)  
    
  5. ==============================

    5.

    SELECT  'From the beginning of month to this day, previous year' AS Label,
            CONVERT(DATETIME,LEFT(CONVERT(VARCHAR(6),DATEADD(YEAR,-1,GETDATE()),112),6)+'01') Begin_date,
            DATEADD(YEAR,-1,GETDATE()) End_date
    
  6. from https://stackoverflow.com/questions/5539517/sql-server-calculating-date-ranges by cc-by-sa and MIT license