4

ユーザーの誕生日と名前の日付のデータベースがあります。7日前から7日前までの誕生日/名前の日を持つすべてのユーザーを選択したいのですが、この選択は機能しますが、誕生日/名前の日が31.12のユーザーの問題を解決する方法がわかりません。例えば。PHPは、「USERは3日前に誕生日を迎えました」と返します。この選択は、年末の7日前と新年の7日後にのみうまく機能します。助けてくれてありがとう。

SELECT `name`, `surname`, `gender`, ('birthday') AS event,
  DATEDIFF(NOW(), DATE(REPLACE(`birthday`, YEAR(`birthday`), YEAR(NOW())))) AS diff
FROM `users`
WHERE DATEDIFF(NOW(), DATE(REPLACE(`birthday`, YEAR(`birthday`), YEAR(NOW()))))
BETWEEN -7 AND 7
UNION
  SELECT `name`, `surname`, `gender`, ('namesday') AS event,
    DATEDIFF(NOW(), DATE(REPLACE(`namesday`, YEAR(`namesday`), YEAR(NOW())))) AS diff
  FROM `users`
  WHERE DATEDIFF(NOW(), DATE(REPLACE(`namesday`, YEAR(`namesday`), YEAR(NOW()))))
  BETWEEN -7 AND 7
4

3 に答える 3

1

いい質問です。これは私がこれまでに行ったことです。完璧かどうかはわかりませんが、良いスタートになるかもしれません。試してみる。

select *,
if(right(birthday,5)>=right(curdate(),5),concat(year(curdate()),'-',right(birthday,5)),concat(year(curdate()+interval 1 year),'-',right(birthday,5))) as next_birthday,
if(right(birthday,5)<right(curdate(),5),concat(year(curdate()),'-',right(birthday,5)),concat(year(curdate()-interval 1 year),'-',right(birthday,5))) as prev_birthday
from users
having next_birthday 
between curdate() - interval 7 day and curdate() + interval 7 day
or prev_birthday 
between curdate() - interval 7 day and curdate()
于 2012-05-14T22:40:27.283 に答える
1

これはかなり簡単だと思います。to_days()を使用してください。この方法はDBに設定されたカレンダーに依存しているため、うるう年について心配する必要はありません。

select
    `name`, `surname`, `gender`, ('birthday') AS event,
    to_days(concat(year(current_date()),'-',month(`birthday`), '-',day_of_month(`birthday`))) as current_yr_bday 
FROM `users`
WHERE 
    to_days(concat(year(current_date()),'-',month(`birthday`), '-',day_of_month(`birthday`))) between to_days(date_sub(current_date() interval 7 days) and to_days(date_add(current_date() interval 7 days
于 2012-05-14T23:20:18.493 に答える
0

ブルートフォース方式では、YEAR-1、YEAR、YEAR + 1の差分を計算し、これら3つの合計のいずれかが条件を満たしているかどうかを確認します。

それほどブルートフォースではないので、現在と1月の最初の差を計算し、それに応じて年数を計算します。

興味深い問題ですが、何か他のことを考えたら戻ってきます。

于 2012-05-14T22:41:02.197 に答える