1

日付フィールドがあり、mysqlで7日前の誕生日を選択するためのクエリを実行します。

たとえば、

出生=1986-08-05

今が2012-07-30の場合、このクエリは私を驚かせます。また

誕生=1986-01-05

今が2012-12-30の場合、このクエリは私を驚かせます。誕生はのフィールドですuser_table

4

4 に答える 4

1
select * from user_table
where date_format(date_sub(birth, interval 7 days), "%m-%d")
    = date_format(now(), "%m-%d")
   or date_format(date_sub(birth, interval 7 days), "%m-%d") = '02-29'
  and month(now()) = 2 and month(date_add(now(), interval 1 day)) = 3
于 2012-12-20T07:30:22.593 に答える
1

私はこの目標のために私の選択を見つけます。

select *,birthdate,
concat(if(date_format(birthdate, '%m') = '12',date_format(curdate(), "%Y")
,date_format(now(), "%Y")),
date_format(date_add(curdate(), interval 7 day), '%Y')) as birthday 
from users 
HAVING birthday BETWEEN curdate() and date_add(curdate(), interval 7 day)

あなたの助けに感謝します。

于 2013-01-27T12:44:30.033 に答える
1

再利用可能なコードが必要で、SQLを読みやすく、保守しやすい状態に保ちたい場合は、SQL関数を使用してください。誕生日は記念日なので...

DROP FUNCTION IF EXISTS anniversary_after;
DELIMITER $$
CREATE FUNCTION anniversary_after(anydate DATE, after DATE)
RETURNS DATE DETERMINISTIC
BEGIN
  DECLARE anniversary DATE;
  DECLARE years INTEGER;
  SET years = YEAR(after) - YEAR(anydate);
  SET anniversary = DATE_ADD(anydate, INTERVAL years YEAR);
  IF anniversary < after THEN
    SET anniversary = DATE_ADD(anniversary, INTERVAL 1 YEAR);
  END IF;
  RETURN anniversary;
END
$$
DELIMITER ;


DROP FUNCTION IF EXISTS anniversary;
CREATE FUNCTION anniversary(anydate DATE)
RETURNS DATE DETERMINISTIC
RETURN anniversary_after(anydate, CURRENT_DATE());

次の記念日の表示日:

SELECT anniversary('1994-04-05');

次の記念日までの日数を表示します。

SELECT DATEDIFF(anniversary('1994-04-05'), CURRENT_DATE());
于 2014-01-06T18:06:39.697 に答える
0

このようなもの?

SELECT user_name, DATE_SUB(birth, INTERVAL 7 DAYS) as SevenDaysBefore from user_table
于 2012-12-20T07:17:11.497 に答える