2016-11-24 3 views
0

Ich habe die folgende Abfrage (was nicht funktioniert) fällig sind: alle user_id des wählenalle Termine auswählen, die in 7 Tagen

SELECT user_id FROM due_dates WHERE due_date < DATE_ADD(CURDATE(),INTERVAL 1 WEEK) 

Ich möchte, wo die DUE_DATE in genau 1 Woche fällig ist.

Was macht mein Skript?

Es sendet eine E-Mail wie "Ihr Konto ist in 7 Tagen fällig".

Kann jemand das beheben?

Antwort

0

ziehe ich den natürlicheren Stenografie.

Wenn due_date ist DATE Typ:

SELECT user_id 
    FROM due_dates 
WHERE due_date = CURDATE() + INTERVAL 1 WEEK 

Wenn due_date eine andere zeitliche ist (DATETIME, TIMESTAMP):

SELECT user_id 
    FROM due_dates 
WHERE due_date >= CURDATE() + INTERVAL 1 WEEK 
    AND due_date < CURDATE() + INTERVAL 1 WEEK + INTERVAL 1 DAY 

Dies ermöglicht die optimiser einen verfügbaren Index auf due_date zu verwenden, und verhindert, dass 23:59:59 Unordnung bei der Verwendung der Inclusive BETWEEN.

N.B. Dies wird effektiv ein temporäres in ein Datum konvertieren, bevor Sie einen Vergleich durchführen. Eine Zeile mit einem Fälligkeitsdatum von 2000-01-08 10:00:00 wird 7 Tage nach einem NOW() von 2000-01-01 xx:xx:xx berücksichtigt und zurückgegeben.

In @ BerndBuffen Antwort, wenn NOW() kehrt 2000-01-01 09:00:00, wird die Reihe herausgefiltert werden, und wenn NOW() kehrt 2000-01-02 09:00:00, wird die Zeile zurückgegeben werden.

Es ist ein subtiler, aber wichtiger Unterschied.

0

Diese Abfrage:

SELECT user_id 
FROM due_dates 
WHERE DATE(due_date) = DATE_ADD(CURDATE(),INTERVAL 1 WEEK) 
-- if due_date is already DATE type then the following should work: 
-- WHERE due_date = DATE_ADD(CURDATE(),INTERVAL 1 WEEK) 
1

Verwendung dieser Abfrage. Wenn Sie BETWEEN verwenden, kann MySQL einen Index für das Fälligkeitsdatum verwenden, sonst ist es ein FULL TABLE SCAN.

SELECT user_id 
FROM due_dates 
WHERE due_date BETWEEN 
    timestamp(date (now() -interval 1 week)) 
AND 
    timestamp(date(now() - interval 1 week + interval 1 day)); 

SAMPLE

mysql> select * from due_dates; 
+---------+---------------------+ 
| user_id | due_date   | 
+---------+---------------------+ 
|  13 | 2015-10-16 01:00:00 | 
|  14 | 2015-10-16 05:00:00 | 
|  15 | 2015-10-17 04:00:00 | 
|  16 | 2015-10-17 05:00:00 | 
|  17 | 2015-10-18 01:00:00 | 
|  18 | 2015-10-19 01:00:00 | 
|  19 | 2015-11-16 01:00:00 | 
|  20 | 2015-11-16 05:00:00 | 
|  21 | 2015-11-17 04:00:00 | 
|  22 | 2015-11-17 05:00:00 | 
|  23 | 2015-11-18 01:00:00 | 
|  24 | 2015-11-19 01:00:00 | 
|  7 | 2016-10-16 01:00:00 | 
|  8 | 2016-10-16 05:00:00 | 
|  9 | 2016-10-17 04:00:00 | 
|  10 | 2016-10-17 05:00:00 | 
|  11 | 2016-10-18 01:00:00 | 
|  12 | 2016-10-19 01:00:00 | 
|  1 | 2016-11-16 01:00:00 | 
|  2 | 2016-11-16 05:00:00 | 
|  3 | 2016-11-17 04:00:00 | 
|  4 | 2016-11-17 05:00:00 | 
|  5 | 2016-11-18 01:00:00 | 
|  6 | 2016-11-19 01:00:00 | 
+---------+---------------------+ 
24 rows in set (0,00 sec) 

mysql> SELECT user_id 
    -> FROM due_dates 
    -> WHERE due_date BETWEEN 
    -> timestamp(date (now() -interval 1 week)) 
    -> AND 
    -> timestamp(date(now() - interval 1 week + interval 1 day)); 
+---------+ 
| user_id | 
+---------+ 
|  3 | 
|  4 | 
+---------+ 
2 rows in set (0,00 sec) 

mysql> EXPLAIN SELECT user_id FROM due_dates WHERE due_date BETWEEN timestamp(date (now() -interval 1 week)) AND timestamp(date(now() - interval 1 week + interval 1 day)); 
+----+-------------+-----------+------------+-------+---------------+----------+---------+------+------+----------+--------------------------+ 
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref | rows | filtered | Extra     | 
+----+-------------+-----------+------------+-------+---------------+----------+---------+------+------+----------+--------------------------+ 
| 1 | SIMPLE  | due_dates | NULL  | range | due_date  | due_date | 5  | NULL | 2 | 100.00 | Using where; Using index | 
+----+-------------+-----------+------------+-------+---------------+----------+---------+------+------+----------+--------------------------+ 
1 row in set, 1 warning (0,00 sec) 

mysql> 
+0

Ziemlich sicher, es zeigt jetzt + Intervall 1 Woche, nicht minus .. OP will Konten fällig 7 Tage in der Zukunft. – Arth

Verwandte Themen