7天

2016-11-24 17 views
0

選擇是由於所有日期我有以下查詢(不工作):7天

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

我想選擇所有的USER_ID的其中DUE_DATE是由於正好1周。

我的腳本是幹什麼的?

它發送電子郵件,如「您的帳戶在7天內到期」。

任何人都知道如何解決這個問題?

回答

0

我更喜歡更自然的簡寫。

如果due_date是類型DATE

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

如果due_date是另一個時間(DATETIMETIMESTAMP):

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:xxNOW()之後7天將會考慮具有2000-01-08 10:00:00的due_date的行並且返回。

在@ BerndBuffen的回答,如果NOW()返回2000-01-01 09:00:00,該行將被過濾掉,如果NOW()返回2000-01-02 09:00:00,該行會被退回。

這是一個微妙但重要的區別。

0

嘗試此查詢:

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

使用此查詢。如果你使用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> 
+0

很確定它現在顯示+間隔1周,而不是減去.. OP想要在未來7天到期的帳戶。 – Arth