選擇是由於所有日期我有以下查詢(不工作):7天
SELECT user_id FROM due_dates WHERE due_date < DATE_ADD(CURDATE(),INTERVAL 1 WEEK)
我想選擇所有的USER_ID的其中DUE_DATE是由於正好1周。
我的腳本是幹什麼的?
它發送電子郵件,如「您的帳戶在7天內到期」。
任何人都知道如何解決這個問題?
選擇是由於所有日期我有以下查詢(不工作):7天
SELECT user_id FROM due_dates WHERE due_date < DATE_ADD(CURDATE(),INTERVAL 1 WEEK)
我想選擇所有的USER_ID的其中DUE_DATE是由於正好1周。
我的腳本是幹什麼的?
它發送電子郵件,如「您的帳戶在7天內到期」。
任何人都知道如何解決這個問題?
我更喜歡更自然的簡寫。
如果due_date
是類型DATE
:
SELECT user_id
FROM due_dates
WHERE due_date = CURDATE() + INTERVAL 1 WEEK
如果due_date
是另一個時間(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
這允許優化器來上due_date
使用可用的索引,並且防止任何23:59:59
使用包容性BETWEEN
時的混亂。
N.B.在進行比較之前,這將有效地將時間轉換爲日期。在2000-01-01 xx:xx:xx
的NOW()
之後7天將會考慮具有2000-01-08 10:00:00
的due_date的行並且返回。
在@ BerndBuffen的回答,如果NOW()
返回2000-01-01 09:00:00
,該行將被過濾掉,如果NOW()
返回2000-01-02 09:00:00
,該行會被退回。
這是一個微妙但重要的區別。
嘗試此查詢:
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)
使用此查詢。如果你使用BETWEEN MySQL可以在due_date上使用索引,否則它是一個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));
樣品
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>
很確定它現在顯示+間隔1周,而不是減去.. OP想要在未來7天到期的帳戶。 – Arth