私はテーブルから人々の誕生日を見つける必要があります..今日から次の7日で来る。クエリSELECT * FROM
..tabledobがありますが、日付がデータベースに送信されていないレコードが返されます。WHERE
つまりLIKE BETWEEN %-08-17 AND %-08-24
、エントリは0000-00-00です。生年月日を日付形式でテーブルに保存しました。バグを見つけるのを手伝ってください。
5 に答える
これはmysqlなので、 DATE_FORMAT()がこれで機能するかどうかはわかりません。しかし、これを試してみてください。
SELECT * FROM users WHERE DATE_FORMAT(dob, '%c-%d')
BETWEEN DATE_FORMAT('1983-08-17', '%c-%d')
AND DATE_FORMAT('1983-08-24', '%c-%d') OR (MONTH('1983-08-17') > MONTH('1983-08-24')
AND (MONTH(dob) >= MONTH('1983-08-17')
OR MONTH(dob) <= MONTH('1983-08-24')))
年は関係ないため、任意の年を使用できます(日付形式を完成させるためだけに)
更新1
SQLFiddle.comでテストしました
SQLFiddleデモ
更新2
最初の答えでごめんなさい。私は正直にこの行を読むのを逃しましたcoming in next 7 days from today
。そして、それが私がに反対票を投じた理由だと思いますImre L
。彼は彼のポイントを持っています。そのような答えを投稿したのは、OPがに関係なくその間の日数を求めていると思ったからyear
です。これがアップデートです。
SELECT ....
FROM ....
WHERE DATE(dob) BETWEEN NOW() AND NOW() + INTERVAL 7 DAY
それが今はっきりしていることを願っています。:D
これは、日付範囲の間に月または年の変更がある場合に正しく処理されます。
select *
from people
where (DAYOFYEAR(dob)+IF(DAYOFYEAR(CURDATE())>DAYOFYEAR(dob),1000,0))
between DAYOFYEAR(CURDATE())
and (DAYOFYEAR(CURDATE() + INTERVAL 7 DAY)+IF(DAYOFYEAR(CURDATE())>DAYOFYEAR(CURDATE() + INTERVAL 7 DAY),1000,0))
生年月日を今年の日付に変換することで、期間が月または年の境界を越える問題を回避できます。これにより、次の週に誕生日が発生するすべての行が選択されます。
SELECT * FROM users
WHERE concat( year(now()), mid(dob,5,6) )
BETWEEN now() AND date_add(now(), interval 7 day)
SELECT
str_to_date(DATE_ADD(dob, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(dob)) YEAR), '%Y-%m-%d') BIRTHDAY,A.*
FROM app_membership A
WHERE str_to_date(DATE_ADD(dob, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(dob)) YEAR), '%Y-%m-%d')
BETWEEN str_to_date('15-10-2017','%d-%m-%Y') and str_to_date('10-11-2017','%d-%m-%Y')
ORDER BY BIRTHDAY ASC;
これを試して。私のために働いた。
12月14日から8月24日までの任意の月/年に生まれた人をリストします。1年前のことを知っています。前年の月数で数える必要があります。開始日の月と終了日の月を比較する際に問題が発生する可能性があるため、複雑です。ただし、次のクエリで解決できる場合があります。
SELECT * FROM t_users WHERE (DATE_FORMAT(d_birth, '%m-%d')
BETWEEN DATE_FORMAT('2017-12-14', '%m-%d') AND
DATE_FORMAT('2018-08-24', '%m-%d'))
OR(MONTH('2017-12-31') >= MONTH('2018-08-24')
AND (MONTH(d_birth) >= MONTH('2017-12-31')
OR MONTH(d_birth) <= MONTH('2018-08-24')))