0

私は自動リスト Web サイトに取り組んでおり、日付を正しく取得する方法の背後にあるロジックに行き詰まっています。

データベース用のSQLフィドルを作成しました http://www.sqlfiddle.com/#!2/e111e/3

毎日午前 12 時に cron を実行したいのですが、1 日で期限切れになるリストのユーザーにメールを送信したい (既に期限切れになっているリストは無視します) が、最低限のことを伝えたいので、それらの間には 24 時間の差が必要ですそこのリストが期限切れになる24時間前。また、1 日以内に有効期限が切れるリストのみを選択する必要があります。

これが私がこれまでに試したことです

SELECT DATE_FORMAT(expiry_date, '%b %d %Y %T') AS expiry_date, DATEDIFF(expiry_date, NOW()) AS days_left FROM `test` WHERE DATEDIFF(expiry_date, NOW()) = 1

しかし、24 時間以内に期限切れになるものも選択しています。

それを手伝ってください。

編集 ///////////////////////////////////////////////// //////////////

私はこれを理解しました。それが正しいかどうか教えてください。

 SELECT DATE_FORMAT(expiry_date, '%b %d %Y %T') AS expiry_date, DATEDIFF(expiry_date, NOW()) AS days_left, HOUR(TIMEDIFF(expiry_date, NOW())) as hours FROM `test`

WHERE DATEDIFF(expiry_date, NOW()) = 1 AND HOUR(TIMEDIFF(expiry_date, NOW())) > 24

4

2 に答える 2

2

MySQLdatediffでは、時間ではなく、実際の日数のみが考慮されます。一緒に作業してTO_SECONDS、差を秒単位でとってみてください。

更新:これはフィドルで動作するコードです:

SELECT DATE_FORMAT(expiry_date, '%b %d %Y %T') AS expDate,
  to_seconds(expiry_date) - to_seconds(NOW()) AS seconds_left
FROM `test`
WHERE
  to_seconds(expiry_date)- to_seconds(now()) <= 86400
  -- AND ... (only include non-expired entries)
于 2013-02-05T10:05:29.627 に答える
0

イベントスケジューラを作成することをお勧めします:

CREATE EVENT EXIPRIYALERT 
ON SCHEDULE EVERY DAY AT '00:00:00' STARTING FROM  '2013-02-04'
DO 
  ---

クエリについては、これを試してください: TIMESTAMPDIFF :

TIMESTAMPDIFF(second,Now(),expiry_date)

SELECT DATE_FORMAT(expiry_date, '%b %d %Y %T') AS expiry_date, 
DATEDIFF(expiry_date, NOW()) AS days_left 
FROM `test` 
WHERE TIMESTAMPDIFF(second,Now(),expiry_date) = 86400
;
于 2013-02-05T10:10:53.643 に答える