복붙노트

[SQL] 어떻게 날짜에 주 수를 변환하는?

SQL

어떻게 날짜에 주 수를 변환하는?

일 년 달력 주 감안할 때, 내가 어떻게 그주의 화요일 날짜로받을 수 있나요?

해결법

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

    1.을 감안할 때 당신은 년 (예를 들어, SELECT 문에서) 변수로 CW (달력 주)는 다음과 같이 날짜를 얻을 수 있습니다 :

    을 감안할 때 당신은 년 (예를 들어, SELECT 문에서) 변수로 CW (달력 주)는 다음과 같이 날짜를 얻을 수 있습니다 :

    DATE_SUB(
      DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK),
      INTERVAL WEEKDAY(
        DATE_ADD(MAKEDATE(year, 1), INTERVAL cw WEEK)
      ) -1 DAY),
    

    문구 DATE_ADD (MAKEDATE (년, 1), INTERVAL CW의 WEEK)는 중복; 변수를 저장하지 않았다. 은 SQL 문은 MySQL을 나를 위해 잘 작동했다.

    UPDATE : 그냥 해명 : WEEKDAY (DATE_ADD (MAKEDATE (년, 1), INTERVAL CW의 주))주의 최초의 날을 얻을 것입니다. 그것에서 수 Substracting (-1 화요일을, -2 수요일 등은 당신을위한 주에 특정 일을 선택합니다). 여길 봐.

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

    2.MySQL의에서 STR_TO_DATE () 함수는 한 줄에 트릭을 할 수 있습니다!

    MySQL의에서 STR_TO_DATE () 함수는 한 줄에 트릭을 할 수 있습니다!

    예 : 우리는 2013 년의 32 회 주 화요일의 날짜를 싶어.

    SELECT STR_TO_DATE('2013 32 Tuesday', '%X %V %W');
    

    겠습니까 출력 :

    '2013-08-13'
    

    나는이 문제에 대한 최고의 짧은 솔루션입니다 생각합니다.

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

    3.나는 모든 발견 달력 주간의 정의는 "연속 7 일 동안 일요일에 시작"고 말했다.

    나는 모든 발견 달력 주간의 정의는 "연속 7 일 동안 일요일에 시작"고 말했다.

    다음은 MySQL의 고유의 것입니다 ... 당신의 마일리지가 다를 수 있습니다 ...

    DATE_ADD (MAKEDATE (년, 1), INTERVAL CW의 WEEK)가 정확하지 올해의 1에서 주를 추가 ...

    mysql> select DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK);
    +----------------------------------------------+
    | DATE_ADD(MAKEDATE(2011, 1), INTERVAL 1 WEEK) |
    +----------------------------------------------+
    | 2011-01-08                                   |
    +----------------------------------------------+
    

    이 정의에 의하면, 1-53에서 달력 주 범위를 가지고,이 그 주 일요일 표현해야하는 경우에만 의미가 있습니다. 따라서, 우리는 화요일를 얻기 위해 올해의 n 번째 일요일에 이일을 추가합니다.

    다음은 올해의 첫 번째 일요일의 날짜를 얻을 수 ...

    mysql> select date_add('2012-01-01', interval (8 - dayofweek('2011-01-01')) % 7 DAY);
    +------------------------------------------------------------------------+
    | date_add('2012-01-01', interval (8 - dayofweek('2011-01-01')) % 7 DAY) |
    +------------------------------------------------------------------------+
    | 2012-01-02                                                             |
    +------------------------------------------------------------------------+
    

    (우리가 1에서 이미 있기 때문에 구주 간격 주) 그래서 이것은 10 일 일요일의 날짜를 얻을 것이다 ...

    mysql> select date_add( date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week);
    +-----------------------------------------------------------------------------------------------------+
    | date_add( date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week) |
    +-----------------------------------------------------------------------------------------------------+
    | 2010-03-07                                                                                          |
    +-----------------------------------------------------------------------------------------------------+
    

    화요일에 도착 2 일 이상 추가 ...

    mysql> select date_add( date_add( date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week), interval 2 day);
    +--------------------------------------------------------------------------------------------------------------------------------+
    | date_add( date_add( date_add('2010-01-01', interval (8 - dayofweek('2010-01-01')) % 7 DAY) , interval 9 week), interval 2 day) |
    +--------------------------------------------------------------------------------------------------------------------------------+
    | 2010-03-09                                                                                                                     |
    +--------------------------------------------------------------------------------------------------------------------------------+
    

    또는 더 일반적으로 :

    select 
    date_add( 
        date_add( 
            date_add('<year>-01-01', interval (8 - dayofweek('<year>-01-01')) % 7 DAY) 
            , interval <week-1> week)
        , interval <dayOfWeek> day
    );
    
  4. ==============================

    4.indago의 대답을보고 한 후 테스트의 무리를하고, 나는 결과로 다음 주 얻고 있었다.

    indago의 대답을보고 한 후 테스트의 무리를하고, 나는 결과로 다음 주 얻고 있었다.

    나는 약간의 조정을했습니다, 그리고 날짜는 일치 :

    SELECT STR_TO_DATE('2019 1 Monday', '%x %v %W') -- beginning of week
    
    SELECT STR_TO_DATE('2019 1 Sunday', '%x %v %W') -- end of week
    

    여기에 결과를 비교할 수 있습니다.

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

    5.

    DELIMITER $$
    CREATE FUNCTION fn_yearweek_to_date(
        var_yearweek INTEGER UNSIGNED,
        var_weekday ENUM(
            'Monday',
            'Tuesday',
            'Wednesday',
            'Thursday',
            'Friday',
            'Saturday',
            'Sunday'
            )
        )
    RETURNS DATE DETERMINISTIC
    BEGIN
        RETURN STR_TO_DATE(CONCAT(var_yearweek, var_weekday), '%x%v%W');
    END;
    DELIMITER ;
    
    SELECT
        fn_yearweek_to_date(YEARWEEK(NOW(), 1), 'Sunday'),
        fn_yearweek_to_date(YEARWEEK(NOW(), 1), 7)
    ;
    
  6. ==============================

    6.그럼 이론적으로는 매월 첫 번째 화요일을 찾은 다음 7 *을 추가 얻기 위해 DW 매개 변수 DATEPART를 사용할 수 있습니다 [CalenderWeek]는 적절한 날짜를 얻을 수 있습니다

    그럼 이론적으로는 매월 첫 번째 화요일을 찾은 다음 7 *을 추가 얻기 위해 DW 매개 변수 DATEPART를 사용할 수 있습니다 [CalenderWeek]는 적절한 날짜를 얻을 수 있습니다

    http://msdn.microsoft.com/en-us/library/ms174420.aspx

  7. ==============================

    7.나는 PHP를 사용하여 함수의 논리를 쓰기 쉽게 될 거라고 생각합니다.

    나는 PHP를 사용하여 함수의 논리를 쓰기 쉽게 될 거라고 생각합니다.

    당신이 PHP 스크립트를 사용하는 경우, 당신은 "일 - 월 - 년"과 같은 형식으로 모든 날짜를 넣어 (1980에서 2038으로 또는 MySQL의 날짜 열에서) 매일 통과하는 루프를 사용할 수 있습니다.

    http://www.php.net/manual/en/function.date-format.php

    그런 다음 요일로 변환하기 위해 그 루프에서 날짜를 날짜 형식을 사용합니다.

    다음은 날짜 형식에서 사용할 수있는 것들의 목록입니다. http://www.php.net/manual/en/function.date.php 디 엔 엘 w 요일 모든 도움 당신.

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

    8.주어 솔루션은 해의 최초의 주 12 월 말에 시작 수 있다는 것을 고려하지 않습니다. 우리가 확인해야합니다 그래서 월 1 일 이전 또는 새 해의 calendarweek에 속하는 경우 :

    주어 솔루션은 해의 최초의 주 12 월 말에 시작 수 있다는 것을 고려하지 않습니다. 우리가 확인해야합니다 그래서 월 1 일 이전 또는 새 해의 calendarweek에 속하는 경우 :

    SET @week=1;
    SET @year=2014;
    SET @x_weeks_after_new_year=DATE_ADD(MAKEDATE(@year, 1), INTERVAL (SELECT IF(WEEKOFYEAR(MAKEDATE(@year, 1))>50 , 0 , -1))+@week WEEK);
    SELECT
      CONCAT(@year, '-', @week) WeekOfYear,
      @weekStart:=DATE_SUB(@x_weeks_after_new_year, INTERVAL WEEKDAY(@x_weeks_after_new_year) DAY) Monday,
      DATE_ADD(@weekStart, INTERVAL 6 DAY) Sunday
    

    이 발생합니다 :

    +------------+------------+------------+
    | WeekOfYear |   Monday   |   Sunday   |
    +------------+------------+------------+
    |   2014-1   | 2013-12-30 | 2014-01-05 |
    +------------+------------+------------+
    
  9. ==============================

    9.여기에 힘의 도움이 그 예입니다 :

    여기에 힘의 도움이 그 예입니다 :

    SET DATEFIRST 1
    declare @wk int  set @wk = 33
    declare @yr int  set @yr = 2011
    
    select dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 2 -
         datepart(dw, dateadd (week, @wk, dateadd (year, @yr-1900, 0)) - 4) as date
    

    그 결과는 다음과 같습니다

    2011-08-16 00:00:00.000
    

    이는 오늘 (화)입니다.

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

    10.upvoted 솔루션은 2014 년 2015 년 나를 위해 일하지만, 올해의 시작은 월요일이 아닌 일요일에 가능하기 때문에 (2016 년 나를 위해없는 일을했다.

    upvoted 솔루션은 2014 년 2015 년 나를 위해 일하지만, 올해의 시작은 월요일이 아닌 일요일에 가능하기 때문에 (2016 년 나를 위해없는 일을했다.

    나는이 문제를 해결하기 위해 다음과 같은 기능을 사용 :

    STR_TO_DATE ( CONCAT (MOD (NR + 1 일, 7) '/'week_nr '/'년), '%와 / U % / % Y')

    내 데이터의 경우 : day_nr = 0 -> 월요일

    day_nr = 6 -> 일요일

    나는 모드 기능이 문제를 해결했다 그래서

  11. from https://stackoverflow.com/questions/7078730/how-to-convert-number-of-week-into-date by cc-by-sa and MIT license