복붙노트

[SQL] 다가오는 생일을 선택 MYSQL

SQL

다가오는 생일을 선택 MYSQL

나는 생일 다음 7 일 동안있는 데이터베이스의 사용자를 선택하는 쿼리를 작성하는 것을 시도하고있다.

나는 연구의 많은 일을했지만 나는 작업 솔루션을 가지고 올 수 없습니다.

생일 필드는 VARCHAR 예 : '04 / 93분의 16 '이와 일에 대한 방법이로 저장됩니다?

이것은 내가 지금까지 무엇을 가지고 :

SELECT * 
FROM   `PERSONS` 
WHERE  `BIRTHDAY` > DATEADD(DAY, -7, GETDATE()) 

내가 출생의 생일없는 날짜를 찾기 위해 노력하고있어 더 분명히해야합니다. 그래서 난 그냥 날짜와 달하지 년을 찾고 있어요.

해결법

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

    1.다음 7 일 모든 생일을 얻으려면, 출생의 날짜로 생년월일과 오늘의 연도 차이를 추가하고 다음 7 일 이내에 떨어지는 경우 다음 찾을 수 있습니다.

    다음 7 일 모든 생일을 얻으려면, 출생의 날짜로 생년월일과 오늘의 연도 차이를 추가하고 다음 7 일 이내에 떨어지는 경우 다음 찾을 수 있습니다.

    SELECT * 
    FROM  persons 
    WHERE  DATE_ADD(birthday, 
                    INTERVAL YEAR(CURDATE())-YEAR(birthday)
                             + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birthday),1,0)
                    YEAR)  
                BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY);
    

    당신은> = 오늘의 생일 단지 변화>를 제외하려면

    SELECT * 
    FROM  persons 
    WHERE  DATE_ADD(birthday, 
                    INTERVAL YEAR(CURDATE())-YEAR(birthday)
                             + IF(DAYOFYEAR(CURDATE()) >= DAYOFYEAR(birthday),1,0)
                    YEAR)  
                BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY);
    
    -- Same as above query with another way to exclude today's birthdays 
    SELECT * 
    FROM  persons 
    WHERE  DATE_ADD(birthday, 
                    INTERVAL YEAR(CURDATE())-YEAR(birthday)
                             + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birthday),1,0)
                    YEAR) 
                BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
         AND DATE_ADD(birthday, INTERVAL YEAR(CURDATE())-YEAR(birthday) YEAR) <> CURDATE();
    
    
    -- Same as above query with another way to exclude today's birthdays 
    SELECT * 
    FROM  persons 
    WHERE  DATE_ADD(birthday, 
                    INTERVAL YEAR(CURDATE())-YEAR(birthday)
                             + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birthday),1,0)
                    YEAR) 
                BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
         AND (MONTH(birthday) <> MONTH(CURDATE()) OR DAY(birthday) <> DAY(CURDATE()));
    

    여기에 모든 쿼리의 데모입니다

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

    2.그것의 매우 쉽고 간단합니다. 조건이나 어떤 다른 당신은 그냥 사용 DATE_FORMAT ()의 MySQL 기능에 필요하면 필요는 사용하지합니다.

    그것의 매우 쉽고 간단합니다. 조건이나 어떤 다른 당신은 그냥 사용 DATE_FORMAT ()의 MySQL 기능에 필요하면 필요는 사용하지합니다.

    여기 내 SQL 쿼리가되는 것입니다

    SELECT id,email ,dob FROM `users` where DATE_FORMAT(dob, '%m-%d') >= DATE_FORMAT(NOW(), '%m-%d') and DATE_FORMAT(dob, '%m-%d') <= DATE_FORMAT((NOW() + INTERVAL +7 DAY), '%m-%d')
    
  3. ==============================

    3.이것은 내 솔루션입니다. 출생의 날짜가 1 월 1 일 오늘의 날짜를 12 월 31 일입니다 경우에도 작동합니다.

    이것은 내 솔루션입니다. 출생의 날짜가 1 월 1 일 오늘의 날짜를 12 월 31 일입니다 경우에도 작동합니다.

    SELECT `id`, `name`, `dateofbirth`,
        DATE_ADD(
            dateofbirth, 
            INTERVAL IF(DAYOFYEAR(dateofbirth) >= DAYOFYEAR(CURDATE()),
                YEAR(CURDATE())-YEAR(dateofbirth),
                YEAR(CURDATE())-YEAR(dateofbirth)+1
            ) YEAR
        ) AS `next_birthday`
    FROM `user` 
    WHERE 
        `dateofbirth` IS NOT NULL
    HAVING 
        `next_birthday` BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
    ORDER BY `next_birthday`
    LIMIT 1000;
    
  4. ==============================

    4.이 시도:

    이 시도:

     Select * From persons
     where (DayOfYear(birthday) >= 7 
             And DayOfYear(birthday) - DayOfYear(curdate()) Between 0 and 6) Or
           (MOD(YEAR(curDate()),4) = 0) And MOD(YEAR(curDate()),100) != 0
            And (DayOfYear(birthday) + 366 - DayOfYear(curdate())) % 366 < 7) Or
             (DayOfYear(birthday) + 365 - DayOfYear(curdate())) % 365 < 7)
    
  5. ==============================

    5.나는이 쿼리 작업을 얻을 수 있었다. 때문에 대부분 로보의 대답의 도움으로.

    나는이 쿼리 작업을 얻을 수 있었다. 때문에 대부분 로보의 대답의 도움으로.

    SELECT * 
    FROM  persons 
    WHERE  DATE_ADD(STR_TO_DATE(birthday, '%m/%d/%Y'), INTERVAL YEAR(CURDATE())-YEAR(STR_TO_DATE(birthday, '%m/%d/%Y')) YEAR) 
                BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY);
    
  6. ==============================

    6.정말 잘 작동이 코드를 발견 :

    정말 잘 작동이 코드를 발견 :

    DATE_ADD(user_birthdate, INTERVAL YEAR(FROM_DAYS(DATEDIFF(CURDATE(), user_birthdate)-1)) + 1 YEAR) AS next_birthday 
    

    실제로 정말 간단, 그것은, 현재의 올해 생일을 사람의 나이를 계산 한 후 일년 추가 할 수 있습니다.

    그것은 당신이 여기에서 찾을 수 있습니다 로버트 EISELE의 답변에 따라 : http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

    추신.

    이 솔루션 어제 생일을했다 명합니다 (-1 FROM_DAYS 계산에 있지만,이 때문에 윤년의 필요 때문에 그의를) 가져올 수 있습니다. 당신은 단지 다음과 같은 조건을 추가해야합니다 있도록이 너무 많이 만 원하기 때문에 7 일 머리를 당신을 고려하지합니다 :

    HAVING next_birthday BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY) 
    
  7. ==============================

    7.로보에서 위의 허용 대답은 쿼리 년 12 월 31 일에서 실행되는 경우, 그에 결함, 사용자가 1 월 1 일에 생일을 가지고 있습니다, 그들은 일치하지 않습니다.

    로보에서 위의 허용 대답은 쿼리 년 12 월 31 일에서 실행되는 경우, 그에 결함, 사용자가 1 월 1 일에 생일을 가지고 있습니다, 그들은 일치하지 않습니다.

    당신은 생일이 이미 올해 통과, 당신은하지 올해, 내년의 생일을보고, 그래서 쿼리에 로직을 추가해야합니다. 자세한 사항은 아래 :

    SELECT *, IF( DAYOFYEAR( STR_TO_DATE(birthday, '%m/%d/%Y') ) < DAYOFYEAR( NOW() ),
    DATE_ADD( STR_TO_DATE(birthday, '%m/%d/%Y'), INTERVAL YEAR( CURDATE() ) - YEAR( STR_TO_DATE(birthday, '%m/%d/%Y') ) + 1 YEAR ),
    DATE_ADD( STR_TO_DATE(birthday, '%m/%d/%Y'), INTERVAL YEAR( CURDATE() ) - YEAR( STR_TO_DATE(birthday, '%m/%d/%Y') ) YEAR ) )
    AS nextBirthday FROM persons
    WHERE nextBirthday BETWEEN CURDATE() AND DATE_ADD( CURDATE(), INTERVAL 7 DAY);
    
  8. ==============================

    8.우리는 (오늘날의 생일 포함) 향후 10 생일을 표시 한 달력과 함께 문제를 했어. 난 그냥 관련 부분에있는 솔루션을 감소했습니다 :

    우리는 (오늘날의 생일 포함) 향후 10 생일을 표시 한 달력과 함께 문제를 했어. 난 그냥 관련 부분에있는 솔루션을 감소했습니다 :

    SELECT first_name, last_name, birth_date,
        IF (DAYOFYEAR(DATE_FORMAT(birth_date,'1980-%m-%d %T')) < DAYOFYEAR(DATE_FORMAT(NOW(),'1980-%m-%d %T')) ,
              DAYOFYEAR(DATE_FORMAT(birth_date,'1980-%m-%d %T'))+368 ,
              DAYOFYEAR(DATE_FORMAT(birth_date,'1980-%m-%d %T'))) AS upcomming
    FROM users
    WHERE birth_date IS NOT NULL AND birth_date !=0
    ORDER BY upcomming ASC 
    LIMIT 0, 10
    

    그것은 윤년에 (실제 포함) 매년 설정하고, 그래서 어떤 문제가되지 않습니다. 당신이 연말에 가까이 경우도, 아무 문제 없습니다. 내가 꽤 마침내이 공유하고 싶어하므로, 작업 솔루션을 찾는 statisfied있어, 어쩌면 다른 사람을 위해 사용입니다 :)

    P.S : 당신은 그냥 DAYOFYEAR 후 +1을 추가, 오늘날의 생일을 표시하지 않으려면 () (NOW DATE_FORMAT ( '1980- % M- % D % T'))

  9. ==============================

    9.이것은 내가 같은 문제에 직면했을 때 내가 한 것입니다 :

    이것은 내가 같은 문제에 직면했을 때 내가 한 것입니다 :

    select * from users 
    where ( month(date_of_birth) > month(CURDATE()) 
     and month(date_of_birth) < month(ADDDATE(CURDATE(),30)) ) 
     or ( month(CURDATE()) = month(date_of_birth) and day(date_of_birth) >= day(CURDATE()) 
     or month(ADDDATE(CURDATE(),30)) = month(date_of_birth) and day(date_of_birth) <= day(ADDDATE(CURDATE(),30)) ) 
     or ( year(CURDATE()) > year(ADDDATE(CURDATE(),30)) and month(date_of_birth) < month(CURDATE()) and month(date_of_birth) > month(ADDDATE(CURDATE(),30)) )
    
  10. ==============================

    10.시간의 범위에서 다가오는 자신의 b'days이 목록을 얻으려고 노력하는 동안, 우리는 문제의 부부에 실행할 수 있습니다.

    시간의 범위에서 다가오는 자신의 b'days이 목록을 얻으려고 노력하는 동안, 우리는 문제의 부부에 실행할 수 있습니다.

    윤년이 때, 당신이 가지고있는 조건이 윤년의 경우를 처리하지 못할 가능성이 있습니다. 오늘 2016년 12월 30일이며 다음 7 일간 b'days이 필요한 것처럼 다음 문제가 될 수 있습니다. 기간의 마지막 해 2017 년에 그래서 일부 조건은이 경우에 실패합니다. 이들은 매우 중요한 테스트 케이스입니다.

    이 스레드에서 고정의 대부분은 당신이 윤년에있을 때 실패 DAYOFYEAR ()를 사용하고 있습니다.

    예를 들면.

    DAYOFYEAR는 ( '2016년 3월 1일 0시 0분 0초') (61)이다. DAYOFYEAR ( '2015년 3월 1일 00:00:00 ") 60

    가장 간단하고 쉬운 방법이 이해합니다.

    윤년에이 작품과도 날짜의 범위는 2 년에 걸쳐.

    SELECT  * 
    FROM    `PERSONS` 
    WHERE  
        /* 
           Here we calculate the next coming b'day for user 
           and check if it is between our span 
        */
        CONCAT(IF( 
                CONCAT( YEAR(CURDATE()), substring(`BIRTHDAY`, 5, length(`BIRTHDAY`))) < CURDATE(), 
                YEAR(CURDATE()) + 1, /* Adds an year if already past */
                YEAR(CURDATE())  /* Use this year if it is upcoming */
             ), substring(`BIRTHDAY`, 5, length(`BIRTHDAY`))) 
        BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL @tot DAY)
    

    PS : 당신이 b'days에 근거하여이 주문하려는 경우 또한 그것은 최고의 솔루션입니다. 당신은 필드로이를 추가해야합니다.

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

    11.내 솔루션 여기에 많은 "연구"를했고, 나는 그것을 아주 쉽게 이해하는 것입니다 생각!

    내 솔루션 여기에 많은 "연구"를했고, 나는 그것을 아주 쉽게 이해하는 것입니다 생각!

    SELECT *,
    (366 + DAYOFYEAR(birth_date) - DAYOFYEAR(NOW())) % 366 as left_days
    FROM `profile`
    ORDER BY left_days;
    
  12. ==============================

    12.

    SELECT * from persons as p
    WHERE   
    MOD( DAYOFYEAR(p.bday) - DAYOFYEAR(CURRENT_DATE()) + 366, 366)  
    BETWEEN 0 and 7  
    ORDER by DAYOFYEAR(p.bday) ASC
    

    이것은 나를 위해 작동합니다.

  13. ==============================

    13.윤년을 해결하기 위해 로보의 대답에 구축

    윤년을 해결하기 위해 로보의 대답에 구축

    SELECT * FROM users
    WHERE DATE_ADD(dob,INTERVAL YEAR(CURDATE())-YEAR(dob)
      + IF(MONTH(CURDATE()) > MONTH(dob), 1,
         IF(MONTH(CURDATE()) = MONTH(dob) AND DAY(CURDATE()) > DAY(dob), 1, 0))
           YEAR)
            BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
    
  14. ==============================

    14.당신이 취할 수있는 또 다른 방법은 데이터베이스 계층을 타격하기 전에 좀 더 일을하는 것입니다 그래서. 예를 들어, 나는 최근 Laravel (PHP)와 포스트 그레스 프로젝트에 이런 짓을. 나는 기본적으로 날짜 (예. 다음 7 일)의 배열을 구축하고, 쿼리에 그 날짜에 생일이있는 사용자를 찾을 어디를했다.

    당신이 취할 수있는 또 다른 방법은 데이터베이스 계층을 타격하기 전에 좀 더 일을하는 것입니다 그래서. 예를 들어, 나는 최근 Laravel (PHP)와 포스트 그레스 프로젝트에 이런 짓을. 나는 기본적으로 날짜 (예. 다음 7 일)의 배열을 구축하고, 쿼리에 그 날짜에 생일이있는 사용자를 찾을 어디를했다.

    User::whereNotNull('birth_date')
        ->where('birth_date', '<=', $endDate)
        ->whereIn(DB::raw("to_char(birth_date, 'MMDD')"), Carbon::range($startDate, $endDate)->map(function ($date) {
            return $date->format('md');
        }))->get();
    
  15. ==============================

    15.다음은 PHP 코드 및 SQL 쿼리가 다가오는 생일을 검색하는 간단한이다. 출생의 날짜는 DATE (YYYY-MM-DD 형식)로 저장된다. 여기에 이미지 설명을 입력

    다음은 PHP 코드 및 SQL 쿼리가 다가오는 생일을 검색하는 간단한이다. 출생의 날짜는 DATE (YYYY-MM-DD 형식)로 저장된다. 여기에 이미지 설명을 입력

    <?php
    $conn = mysqli_connect('localhost', 'user', 'paasword', 'databasename');
    $nod = 5;     //Number of days upto which you want to retrieve birthdays
    $delim = $filter = "";
    for($i=0;$i<$nod;$i++){
        $date = date_create(date('Y-m-d'));
        date_add($date,date_interval_create_from_date_string("$i days"));
        $filter .= $delim."'".date_format($date,"m-d")."'";
        $delim = ", ";
    }
    $sql = "SELECT NAME, DOB, MOBILE, EMAIL, TITLE FROM tablename WHERE SUBSTR(DOB,6) IN ($filter) ORDER BY SUBSTR(DOB,6) ASC";
    $result = mysqli_query($conn, $sql);    
    $i=0;
    echo '
    <table class="table-1 mt-2 table-responsive table-bordered">
        <tr>
            <th>S. No.</th>
            <th>Name</th>
            <th>DOB</th>
            <th>MOBILE</th>
        </tr>';
    while($row = mysqli_fetch_array($result)){
        $i++;
        $dob = date('Y-').date_format(date_create($row["DOB"]),'m-d');
        $day = date_format(date_create($dob),'w');
        switch ($day){
            case 0:
                $day = "Sunday"; break;
            case 1:
                $day = "Monday"; break;
            case 2:
                $day = "Tuesday"; break;
            case 3:
                $day = "Wednesday"; break;
            case 4:
                $day = "Thursday"; break;
            case 5:
                $day = "Friday"; break;
            case 6:
                $day = "Saturday"; break;
        }
        echo"
        <tr>
            <td>".$i."</td>
            <td>".$row["NAME"]."</td>
            <td>".date_format(date_create($row["DOB"]),'d-m-Y')." $day</td>
            <td>".$row["MOBILE"]."</td>
        </tr>
        ";
    }
    echo"
    </table>";
    ?>
    
  16. from https://stackoverflow.com/questions/18747853/mysql-select-upcoming-birthdays by cc-by-sa and MIT license