[SQL] 다가오는 생일을 선택 MYSQL
SQL다가오는 생일을 선택 MYSQL
나는 생일 다음 7 일 동안있는 데이터베이스의 사용자를 선택하는 쿼리를 작성하는 것을 시도하고있다.
나는 연구의 많은 일을했지만 나는 작업 솔루션을 가지고 올 수 없습니다.
생일 필드는 VARCHAR 예 : '04 / 93분의 16 '이와 일에 대한 방법이로 저장됩니다?
이것은 내가 지금까지 무엇을 가지고 :
SELECT *
FROM `PERSONS`
WHERE `BIRTHDAY` > DATEADD(DAY, -7, GETDATE())
내가 출생의 생일없는 날짜를 찾기 위해 노력하고있어 더 분명히해야합니다. 그래서 난 그냥 날짜와 달하지 년을 찾고 있어요.
해결법
-
==============================
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.그것의 매우 쉽고 간단합니다. 조건이나 어떤 다른 당신은 그냥 사용 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.이것은 내 솔루션입니다. 출생의 날짜가 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.이 시도:
이 시도:
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.나는이 쿼리 작업을 얻을 수 있었다. 때문에 대부분 로보의 대답의 도움으로.
나는이 쿼리 작업을 얻을 수 있었다. 때문에 대부분 로보의 대답의 도움으로.
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.정말 잘 작동이 코드를 발견 :
정말 잘 작동이 코드를 발견 :
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.로보에서 위의 허용 대답은 쿼리 년 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.우리는 (오늘날의 생일 포함) 향후 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.이것은 내가 같은 문제에 직면했을 때 내가 한 것입니다 :
이것은 내가 같은 문제에 직면했을 때 내가 한 것입니다 :
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.시간의 범위에서 다가오는 자신의 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.내 솔루션 여기에 많은 "연구"를했고, 나는 그것을 아주 쉽게 이해하는 것입니다 생각!
내 솔루션 여기에 많은 "연구"를했고, 나는 그것을 아주 쉽게 이해하는 것입니다 생각!
SELECT *, (366 + DAYOFYEAR(birth_date) - DAYOFYEAR(NOW())) % 366 as left_days FROM `profile` ORDER BY left_days;
-
==============================
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.윤년을 해결하기 위해 로보의 대답에 구축
윤년을 해결하기 위해 로보의 대답에 구축
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.당신이 취할 수있는 또 다른 방법은 데이터베이스 계층을 타격하기 전에 좀 더 일을하는 것입니다 그래서. 예를 들어, 나는 최근 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.다음은 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>"; ?>
from https://stackoverflow.com/questions/18747853/mysql-select-upcoming-birthdays by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL의 날짜 일련? (0) | 2020.06.11 |
---|---|
[SQL] 총 시간은 하루 MySQL의에서 일하기 (0) | 2020.06.11 |
[SQL] SQL : 집계 문자열 함께 (0) | 2020.06.11 |
[SQL] 두 번째 SELECT 쿼리의 경우 첫 번째 SELECT 반환 0 행 (0) | 2020.06.11 |
[SQL] SQL에 LINQ : 어떻게 이름이 변경되는 자동 생성 된 개체 이름을 중지합니까? (0) | 2020.06.11 |