복붙노트

[SQL] 주 번호에서 일주일의 시작 날짜와 주 종료 날짜를 가져옵니다

SQL

주 번호에서 일주일의 시작 날짜와 주 종료 날짜를 가져옵니다

나는 데이터베이스에 회원의 결혼식 날짜를 계산하는 쿼리가 있습니다.

SELECT 
  SUM(NumberOfBrides) AS [Wedding Count]
  , DATEPART( wk, WeddingDate) AS [Week Number]
  , DATEPART( year, WeddingDate) AS [Year]
FROM  MemberWeddingDates
GROUP BY DATEPART(year, WeddingDate), DATEPART(wk, WeddingDate)
ORDER BY SUM(NumberOfBrides) DESC

시작과 매주의 최종 결과 집합으로 표현하면 어떻게 해결합니까?

SELECT
  SUM(NumberOfBrides) AS [Wedding Count]
  , DATEPART(wk, WeddingDate) AS [Week Number]
  , DATEPART(year, WeddingDate) AS [Year]
  , ??? AS WeekStart
  , ??? AS WeekEnd
FROM  MemberWeddingDates
GROUP BY DATEPART(year, WeddingDate), DATEPART(wk, WeddingDate)
ORDER BY SUM(NumberOfBrides) DESC

해결법

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

    1.당신은 요일을 찾아 시작 및 종료 날짜를 얻기 위해 일에 날짜 추가 할 수 있습니다 ..

    당신은 요일을 찾아 시작 및 종료 날짜를 얻기 위해 일에 날짜 추가 할 수 있습니다 ..

    DATEADD(dd, -(DATEPART(dw, WeddingDate)-1), WeddingDate) [WeekStart]
    
    DATEADD(dd, 7-(DATEPART(dw, WeddingDate)), WeddingDate) [WeekEnd]
    

    당신은 아마도 잘 것처럼 날짜에서 시간을 제거보고 싶다.

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

    2.여기에 DATEFIRST 불가지론 솔루션입니다 :

    여기에 DATEFIRST 불가지론 솔루션입니다 :

    SET DATEFIRST 4     /* or use any other weird value to test it */
    DECLARE @d DATETIME
    
    SET @d = GETDATE()
    
    SELECT
      @d ThatDate,
      DATEADD(dd, 0 - (@@DATEFIRST + 5 + DATEPART(dw, @d)) % 7, @d) Monday,
      DATEADD(dd, 6 - (@@DATEFIRST + 5 + DATEPART(dw, @d)) % 7, @d) Sunday
    
  3. ==============================

    3.당신은이를 사용할 수 있습니다 :

    당신은이를 사용할 수 있습니다 :

      SELECT DATEADD(day, DATEDIFF(day, 0, WeddingDate) /7*7, 0) AS weekstart,
             DATEADD(day, DATEDIFF(day, 6, WeddingDate-1) /7*7 + 7, 6) AS WeekEnd
    
  4. ==============================

    4.Tomalak의 대답 @에 확장. 공식은 일요일, 월요일 이외의 일을 위해 작동하지만 당신은 5이고 다른 값을 사용해야합니다. 당신이 필요로하는 가치에 도달하기위한 방법입니다

    Tomalak의 대답 @에 확장. 공식은 일요일, 월요일 이외의 일을 위해 작동하지만 당신은 5이고 다른 값을 사용해야합니다. 당신이 필요로하는 가치에 도달하기위한 방법입니다

    Value Needed = 7 - (Value From Date First Documentation for Desired Day Of Week) - 1
    

    여기에 문서에 대한 링크는 다음과 같습니다 https://msdn.microsoft.com/en-us/library/ms181598.aspx

    그리고 여기 당신을 위해 그것을 레이아웃 테이블입니다.

              | DATEFIRST VALUE |   Formula Value   |   7 - DATEFIRSTVALUE - 1
    Monday    | 1               |          5        |   7 - 1- 1 = 5
    Tuesday   | 2               |          4        |   7 - 2 - 1 = 4
    Wednesday | 3               |          3        |   7 - 3 - 1 = 3
    Thursday  | 4               |          2        |   7 - 4 - 1 = 2
    Friday    | 5               |          1        |   7 - 5 - 1 = 1
    Saturday  | 6               |          0        |   7 - 6 - 1 = 0
    Sunday    | 7               |         -1        |   7 - 7 - 1 = -1
    

    하지만 당신은 그 테이블과 단지 공식을 기억하지 않아도, 실제로는 약간 다른 일이 너무 주요 필요가 나머지 일의 정확한 수 있도록하는 값을 사용하는 것입니다 사용할 수 있습니다.

    다음은 작업 예입니다 :

    DECLARE @MondayDateFirstValue INT = 1
    DECLARE @FridayDateFirstValue INT = 5
    DECLARE @TestDate DATE = GETDATE()
    
    SET @MondayDateFirstValue = 7 - @MondayDateFirstValue - 1
    SET @FridayDateFirstValue = 7 - @FridayDateFirstValue - 1
    
    SET DATEFIRST 6 -- notice this is saturday
    
    SELECT 
        DATEADD(DAY, 0 - (@@DATEFIRST + @MondayDateFirstValue + DATEPART(dw,@TestDate)) % 7, @TestDate)  as MondayStartOfWeek
        ,DATEADD(DAY, 6 - (@@DATEFIRST + @MondayDateFirstValue + DATEPART(dw,@TestDate)) % 7, @TestDate) as MondayEndOfWeek
       ,DATEADD(DAY, 0 - (@@DATEFIRST + @FridayDateFirstValue + DATEPART(dw,@TestDate)) % 7, @TestDate)  as FridayStartOfWeek
        ,DATEADD(DAY, 6 - (@@DATEFIRST + @FridayDateFirstValue + DATEPART(dw,@TestDate)) % 7, @TestDate) as FridayEndOfWeek
    
    
    SET DATEFIRST 2 --notice this is tuesday
    
    SELECT 
        DATEADD(DAY, 0 - (@@DATEFIRST + @MondayDateFirstValue + DATEPART(dw,@TestDate)) % 7, @TestDate)  as MondayStartOfWeek
        ,DATEADD(DAY, 6 - (@@DATEFIRST + @MondayDateFirstValue + DATEPART(dw,@TestDate)) % 7, @TestDate) as MondayEndOfWeek
       ,DATEADD(DAY, 0 - (@@DATEFIRST + @FridayDateFirstValue + DATEPART(dw,@TestDate)) % 7, @TestDate)  as FridayStartOfWeek
        ,DATEADD(DAY, 6 - (@@DATEFIRST + @FridayDateFirstValue + DATEPART(dw,@TestDate)) % 7, @TestDate) as FridayEndOfWeek
    

    이 방법은 내가 포함 여러 주 방법과 날짜 차원을 구축하고 같이 내가 필요한 것입니다 DATEFIRST 설정의 무신론자 될 것입니다.

  5. ==============================

    5.여기에 또 다른 버전입니다. 당신의 시나리오 주간의 마지막 날에 주 금요일의 첫째 날이 토요일을 필요로하는 경우, 코드 아래는 그것을 처리합니다 :

    여기에 또 다른 버전입니다. 당신의 시나리오 주간의 마지막 날에 주 금요일의 첫째 날이 토요일을 필요로하는 경우, 코드 아래는 그것을 처리합니다 :

      DECLARE @myDate DATE = GETDATE()
      SELECT    @myDate,
        DATENAME(WEEKDAY,@myDate),
        DATEADD(DD,-(CHOOSE(DATEPART(dw, @myDate), 1,2,3,4,5,6,0)),@myDate) AS WeekStartDate,
        DATEADD(DD,7-CHOOSE(DATEPART(dw, @myDate), 2,3,4,5,6,7,1),@myDate) AS WeekEndDate
    

  6. ==============================

    6.쿼리는 시작과 현재 일주일의 끝 사이의 데이터를 제공 아래 일요일에서 토요일로 시작

    쿼리는 시작과 현재 일주일의 끝 사이의 데이터를 제공 아래 일요일에서 토요일로 시작

    SELECT DOB FROM PROFILE_INFO WHERE DAY(DOB) BETWEEN
    DAY( CURRENT_DATE() - (SELECT DAYOFWEEK(CURRENT_DATE())-1))
    AND
    DAY((CURRENT_DATE()+(7 - (SELECT DAYOFWEEK(CURRENT_DATE())) ) ))
    AND
    MONTH(DOB)=MONTH(CURRENT_DATE())
    
  7. ==============================

    7.우리가이 개 부분에 문제를 분해하자 :

    우리가이 개 부분에 문제를 분해하자 :

    1) 요일을 결정

    DATEPART (... DW)은 DATEFIRST 설정 (문서)에 대해 다수의, 1 ... (7)을 반환한다. 다음 표는 가능한 값을 요약

                                                       @@DATEFIRST
    +------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
    |                                    |  1  |  2  |  3  |  4  |  5  |  6  |  7  | DOW |
    +------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
    |  DATEPART(dw, /*Mon*/ '20010101')  |  1  |  7  |  6  |  5  |  4  |  3  |  2  |  1  |
    |  DATEPART(dw, /*Tue*/ '20010102')  |  2  |  1  |  7  |  6  |  5  |  4  |  3  |  2  |
    |  DATEPART(dw, /*Wed*/ '20010103')  |  3  |  2  |  1  |  7  |  6  |  5  |  4  |  3  |
    |  DATEPART(dw, /*Thu*/ '20010104')  |  4  |  3  |  2  |  1  |  7  |  6  |  5  |  4  |
    |  DATEPART(dw, /*Fri*/ '20010105')  |  5  |  4  |  3  |  2  |  1  |  7  |  6  |  5  |
    |  DATEPART(dw, /*Sat*/ '20010106')  |  6  |  5  |  4  |  3  |  2  |  1  |  7  |  6  |
    |  DATEPART(dw, /*Sun*/ '20010107')  |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  7  |
    +------------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+
    

    마지막 열은 * 일요일 주 월요일에 이상적인 요일 값이 포함되어 있습니다. 단지 차트를 살펴보면 우리는 다음 식을 마련 :

    (@@DATEFIRST + DATEPART(dw, SomeDate) - 1 - 1) % 7 + 1
    

    2) 주어진 날짜의 월요일과 일요일을 계산

    이것은 요일 값 사소한 덕분이다. 다음은 그 예이다 :

    WITH TestData(SomeDate) AS (
        SELECT CAST('20001225' AS DATETIME) UNION ALL
        SELECT CAST('20001226' AS DATETIME) UNION ALL
        SELECT CAST('20001227' AS DATETIME) UNION ALL
        SELECT CAST('20001228' AS DATETIME) UNION ALL
        SELECT CAST('20001229' AS DATETIME) UNION ALL
        SELECT CAST('20001230' AS DATETIME) UNION ALL
        SELECT CAST('20001231' AS DATETIME) UNION ALL
        SELECT CAST('20010101' AS DATETIME) UNION ALL
        SELECT CAST('20010102' AS DATETIME) UNION ALL
        SELECT CAST('20010103' AS DATETIME) UNION ALL
        SELECT CAST('20010104' AS DATETIME) UNION ALL
        SELECT CAST('20010105' AS DATETIME) UNION ALL
        SELECT CAST('20010106' AS DATETIME) UNION ALL
        SELECT CAST('20010107' AS DATETIME) UNION ALL
        SELECT CAST('20010108' AS DATETIME) UNION ALL
        SELECT CAST('20010109' AS DATETIME) UNION ALL
        SELECT CAST('20010110' AS DATETIME) UNION ALL
        SELECT CAST('20010111' AS DATETIME) UNION ALL
        SELECT CAST('20010112' AS DATETIME) UNION ALL
        SELECT CAST('20010113' AS DATETIME) UNION ALL
        SELECT CAST('20010114' AS DATETIME)
    ), TestDataPlusDOW AS (
        SELECT SomeDate, (@@DATEFIRST + DATEPART(dw, SomeDate) - 1 - 1) % 7 + 1 AS DOW
        FROM TestData
    )
    SELECT
        FORMAT(SomeDate,                            'ddd yyyy-MM-dd') AS SomeDate,
        FORMAT(DATEADD(dd, -DOW + 1, SomeDate),     'ddd yyyy-MM-dd') AS [Monday],
        FORMAT(DATEADD(dd, -DOW + 1 + 6, SomeDate), 'ddd yyyy-MM-dd') AS [Sunday]
    FROM TestDataPlusDOW
    

    산출:

    +------------------+------------------+------------------+
    |  SomeDate        |  Monday          |    Sunday        |
    +------------------+------------------+------------------+
    |  Mon 2000-12-25  |  Mon 2000-12-25  |  Sun 2000-12-31  |
    |  Tue 2000-12-26  |  Mon 2000-12-25  |  Sun 2000-12-31  |
    |  Wed 2000-12-27  |  Mon 2000-12-25  |  Sun 2000-12-31  |
    |  Thu 2000-12-28  |  Mon 2000-12-25  |  Sun 2000-12-31  |
    |  Fri 2000-12-29  |  Mon 2000-12-25  |  Sun 2000-12-31  |
    |  Sat 2000-12-30  |  Mon 2000-12-25  |  Sun 2000-12-31  |
    |  Sun 2000-12-31  |  Mon 2000-12-25  |  Sun 2000-12-31  |
    |  Mon 2001-01-01  |  Mon 2001-01-01  |  Sun 2001-01-07  |
    |  Tue 2001-01-02  |  Mon 2001-01-01  |  Sun 2001-01-07  |
    |  Wed 2001-01-03  |  Mon 2001-01-01  |  Sun 2001-01-07  |
    |  Thu 2001-01-04  |  Mon 2001-01-01  |  Sun 2001-01-07  |
    |  Fri 2001-01-05  |  Mon 2001-01-01  |  Sun 2001-01-07  |
    |  Sat 2001-01-06  |  Mon 2001-01-01  |  Sun 2001-01-07  |
    |  Sun 2001-01-07  |  Mon 2001-01-01  |  Sun 2001-01-07  |
    |  Mon 2001-01-08  |  Mon 2001-01-08  |  Sun 2001-01-14  |
    |  Tue 2001-01-09  |  Mon 2001-01-08  |  Sun 2001-01-14  |
    |  Wed 2001-01-10  |  Mon 2001-01-08  |  Sun 2001-01-14  |
    |  Thu 2001-01-11  |  Mon 2001-01-08  |  Sun 2001-01-14  |
    |  Fri 2001-01-12  |  Mon 2001-01-08  |  Sun 2001-01-14  |
    |  Sat 2001-01-13  |  Mon 2001-01-08  |  Sun 2001-01-14  |
    |  Sun 2001-01-14  |  Mon 2001-01-08  |  Sun 2001-01-14  |
    +------------------+------------------+------------------+
    

    * 일요일부터 토요일까지 주 동안 당신은 조금 같은 1 곳을 추가 방정식을 조정해야합니다.

  8. ==============================

    8.난 그냥이 하나와 유사한 경우가 발생하지만, 여기에 해결책은 나에게 도움이되지 보인다. 그래서 나는 나 자신에 의해 그것을 알아낼하려고합니다. 나는 주 시작 날짜 만 주 종료일 비슷한 논리를해야 운동.

    난 그냥이 하나와 유사한 경우가 발생하지만, 여기에 해결책은 나에게 도움이되지 보인다. 그래서 나는 나 자신에 의해 그것을 알아낼하려고합니다. 나는 주 시작 날짜 만 주 종료일 비슷한 논리를해야 운동.

    Select 
          Sum(NumberOfBrides) As [Wedding Count], 
          DATEPART( wk, WeddingDate) as [Week Number],
          DATEPART( year, WeddingDate) as [Year],
          DATEADD(DAY, 1 - DATEPART(WEEKDAY, dateadd(wk, DATEPART( wk, WeddingDate)-1,  DATEADD(yy,DATEPART( year, WeddingDate)-1900,0))), dateadd(wk, DATEPART( wk, WeddingDate)-1, DATEADD(yy,DATEPART( year, WeddingDate)-1900,0))) as [Week Start]
    
    FROM  MemberWeddingDates
    Group By DATEPART( year, WeddingDate), DATEPART( wk, WeddingDate)
    Order By Sum(NumberOfBrides) Desc
    
  9. ==============================

    9.가장 대답은 해의 첫째 주와 마지막 주를 제외하고 잘 작동 투표했다. 예를 들어, WeddingDate의 값은 결과가 2015년 12월 27일 및 2016년 1월 2일 될 것입니다, '2016년 1월 1일'이지만 정답은 2016년 1월 1일 및 2016년 1월 2일입니다.

    가장 대답은 해의 첫째 주와 마지막 주를 제외하고 잘 작동 투표했다. 예를 들어, WeddingDate의 값은 결과가 2015년 12월 27일 및 2016년 1월 2일 될 것입니다, '2016년 1월 1일'이지만 정답은 2016년 1월 1일 및 2016년 1월 2일입니다.

    이 시도:

    Select 
      Sum(NumberOfBrides) As [Wedding Count], 
      DATEPART( wk, WeddingDate) as [Week Number],
      DATEPART( year, WeddingDate) as [Year],
      MAX(CASE WHEN DATEPART(WEEK, WeddingDate) = 1 THEN CAST(DATEADD(YEAR, DATEDIFF(YEAR, 0, WeddingDate), 0) AS date) ELSE DATEADD(DAY, 7 * DATEPART(WEEK, WeddingDate), DATEADD(DAY, -(DATEPART(WEEKDAY, DATEADD(YEAR, DATEDIFF(YEAR, 0, WeddingDate), 0)) + 6), DATEADD(YEAR, DATEDIFF(YEAR, 0, WeddingDate), 0))) END) as WeekStart,
      MAX(CASE WHEN DATEPART(WEEK, WeddingDate) = DATEPART(WEEK, DATEADD(DAY, -1, DATEADD(YEAR, DATEDIFF(YEAR, 0, WeddingDate) + 1, 0))) THEN DATEADD(DAY, -1, DATEADD(YEAR, DATEDIFF(YEAR, 0, WeddingDate) + 1, 0)) ELSE DATEADD(DAY, 7 * DATEPART(WEEK, WeddingDate) + 6, DATEADD(DAY, -(DATEPART(WEEKDAY, DATEADD(YEAR, DATEDIFF(YEAR, 0, WeddingDate), 0)) + 6), DATEADD(YEAR, DATEDIFF(YEAR, 0, WeddingDate), 0))) END) as WeekEnd
    FROM  MemberWeddingDates
    Group By DATEPART( year, WeddingDate), DATEPART( wk, WeddingDate)
    Order By Sum(NumberOfBrides) Desc;
    

    그 결과 외모가 좋아 :

    그것은 모든 주, 1 또는 다른 사람을 위해 작동합니다.

  10. ==============================

    10.이것은 나에서 온 것이 아니라이 작업을 수행했다 :

    이것은 나에서 온 것이 아니라이 작업을 수행했다 :

    SELECT DATEADD(wk, -1, DATEADD(DAY, 1-DATEPART(WEEKDAY, GETDATE()), DATEDIFF(dd, 0, GETDATE()))) --first day previous week
    SELECT DATEADD(wk, 0, DATEADD(DAY, 1-DATEPART(WEEKDAY, GETDATE()), DATEDIFF(dd, 0, GETDATE()))) --first day current week
    SELECT DATEADD(wk, 1, DATEADD(DAY, 1-DATEPART(WEEKDAY, GETDATE()), DATEDIFF(dd, 0, GETDATE()))) --first day next week
    
    SELECT DATEADD(wk, 0, DATEADD(DAY, 0-DATEPART(WEEKDAY, GETDATE()), DATEDIFF(dd, 0, GETDATE()))) --last day previous week
    SELECT DATEADD(wk, 1, DATEADD(DAY, 0-DATEPART(WEEKDAY, GETDATE()), DATEDIFF(dd, 0, GETDATE()))) --last day current week
    SELECT DATEADD(wk, 2, DATEADD(DAY, 0-DATEPART(WEEKDAY, GETDATE()), DATEDIFF(dd, 0, GETDATE()))) --last day next week
    

    난 여기가 발견했다.

  11. ==============================

    11.전원 BI 닥스 수식에 대한 날짜에서 주 시작 및 종료 날짜

    전원 BI 닥스 수식에 대한 날짜에서 주 시작 및 종료 날짜

    WeekStartDate = [DateColumn] - (WEEKDAY([DateColumn])-1)
    WeekEndDate = [DateColumn] + (7-WEEKDAY([DateColumn]))
    
  12. ==============================

    12.이것은 내 솔루션입니다

    이것은 내 솔루션입니다

    
        SET DATEFIRST 1;    /* change to use a different datefirst  */
        DECLARE @date DATETIME
        SET @date = CAST('2/6/2019' as date)
    
        SELECT  DATEADD(dd,0 - (DATEPART(dw, @date) - 1) ,@date) [dateFrom], 
                DATEADD(dd,6 - (DATEPART(dw, @date) - 1) ,@date) [dateTo]
    
    
  13. ==============================

    13.사용자 정의 날짜 별 시작 날짜 및 종료 날짜를 가져옵니다 DECLARE @date NVARCHAR (50) = '2019년 5월 19일' 고르다 DATEADD (DAY, DATEPART은 (평일 @date) THEN 1 ELSE -6 CASE 2 = - DATEPART (평일 @date) END를, CAST (@date AS의 DATE)) WEEK_START_DATE] , DATEADD (DAY, DATEPART은 (평일 @date) = CASE 1 THEN 0 ELSE 8 - DATEPART (평일 @date) END, CAST (@date AS의 DATE)) Week_End_Date]

    사용자 정의 날짜 별 시작 날짜 및 종료 날짜를 가져옵니다 DECLARE @date NVARCHAR (50) = '2019년 5월 19일' 고르다 DATEADD (DAY, DATEPART은 (평일 @date) THEN 1 ELSE -6 CASE 2 = - DATEPART (평일 @date) END를, CAST (@date AS의 DATE)) WEEK_START_DATE] , DATEADD (DAY, DATEPART은 (평일 @date) = CASE 1 THEN 0 ELSE 8 - DATEPART (평일 @date) END, CAST (@date AS의 DATE)) Week_End_Date]

  14. ==============================

    14.나는 다른 방법을 가지고, 그것은 주 현재의 선택 하루를 시작하고 하루 끝입니다 :

    나는 다른 방법을 가지고, 그것은 주 현재의 선택 하루를 시작하고 하루 끝입니다 :

  15. ==============================

    15.또 다른 방법은 그것을 할 수 있습니다 :

    또 다른 방법은 그것을 할 수 있습니다 :

    declare @week_number int = 6280 -- 2020-05-07
    declare @start_weekday int = 0 -- Monday
    declare @end_weekday int = 6 -- next Sunday
    
    select 
        dateadd(week, @week_number, @start_weekday), 
        dateadd(week, @week_number, @end_weekday)
    

    설명:

  16. ==============================

    16.일요일은 시작 요일로 간주되는 경우, 여기에 코드입니다

    일요일은 시작 요일로 간주되는 경우, 여기에 코드입니다

    Declare @currentdate date = '18 Jun 2020'
    
    select DATEADD(D, -(DATEPART(WEEKDAY, @currentdate) - 1), @currentdate)
    
    select DATEADD(D, (7 - DATEPART(WEEKDAY, @currentdate)), @currentdate)
    
  17. ==============================

    17.방법을 잘 모르 도움이,하지만 난 Netezza를 SQL에 솔루션을 찾고에서 여기 종료 및 스택 오버 플로우에 하나를 찾을 수 없습니다.

    방법을 잘 모르 도움이,하지만 난 Netezza를 SQL에 솔루션을 찾고에서 여기 종료 및 스택 오버 플로우에 하나를 찾을 수 없습니다.

    IBM의 Netezza를 위해 당신은 같은 (주 시작 월, 주 최종 일에) 뭔가를 사용합니다 :

    고르다 NEXT_DAY (WeddingDate '일') -6,7- WeekStart로서

    주말 같은 NEXT_DAY (WeddingDate '일')

  18. ==============================

    18.액세스 쿼리를 들어, 당신은 필드로 아래 형식으로 사용할 수 있습니다

    액세스 쿼리를 들어, 당신은 필드로 아래 형식으로 사용할 수 있습니다

    "FirstDayofWeek:IIf(IsDate([ForwardedForActionDate]),CDate(Format([ForwardedForActionDate],"dd/mm/yyyy"))-(Weekday([ForwardedForActionDate])-1))"
    

    직접 계산 가능 ..

  19. from https://stackoverflow.com/questions/1267126/get-the-week-start-date-and-week-end-date-from-week-number by cc-by-sa and MIT license