[英]how to select rows from a database in php where the date field is 7 days in the future
[英]PHP Select from MySQL where date field is 7 days in the future
我有一個自動檢查器,用於檢查將在接下來的7天內過期的域,並將其發送並通過電子郵件發送給客戶。
我正在使用此SQL查詢:
SELECT * from domain_names where status = '' or status = 'valid' and expiry_date = DATE(NOW() + INTERVAL 7 DAY)
但它無法正常工作。 我需要它來檢查expirey_date確切地是未來7天的行。 同樣,如果檢查程序停止運行,並且在未運行的時間內錯過了一些行,它也需要執行這些行
您可能expiry_date
定義為datetime值,這意味着您的比較不正確。 例如你需要使用
SELECT ... WHERE date(expiry_date) = date(now() + interval 7 day)
相反(請注意,在date()
操作中將+7天換行了。
例如
給定一個帶有日期和日期時間字段的表:
+------------+---------------------+
| d | dt |
+------------+---------------------+
| 2013-06-28 | 2013-06-28 08:23:03 |
+------------+---------------------+
注意比較結果如何:
mysql> select d=now(), d=date(now()), dt=now(), dt=date(now()), now() from x;
+---------+---------------+----------+----------------+---------------------+
| d=now() | d=date(now()) | dt=now() | dt=date(now()) | now() |
+---------+---------------+----------+----------------+---------------------+
| 0 | 1 | 0 | 0 | 2013-06-28 08:26:20 |
+---------+---------------+----------+----------------+---------------------+
1 row in set (0.00 sec)
日期與日期時間=假
日期與日期=真
datetime vs datetime = false(hh:mm:ss不匹配,因此不相等)
datetime vs date = false(日期擴展為yyyy-mm-hh 00:00:00且hh:mm:ss不匹配
您必須在and
/ or
條件中使用括號
SELECT * from domain_names
where (status = '' or status = 'valid')
and expiry_date = curdate() + INTERVAL 7 DAY
或者用in
你的情況
SELECT * from domain_names
where status in ('', 'valid')
and expiry_date = curdate() + INTERVAL 7 DAY
假設您的到期日期是正確的日期時間字段
expiry_date=DATE_ADD(NOW(), INTERVAL 7 DAY)
比...更可靠
expiry_date=DATE(NOW() + INTERVAL 7 DAY)
實際考慮一下,如果您想在未來的7天之內也必須使用datediff
這樣的事情只返回到期日恰好是從今天起7天的請求。
DATEDIFF(expiry_date,DATE(NOW() + INTERVAL 7 DAY))=7
盡管這並不是萬無一失的方法,但最好還是讓它對照現在和將來7天之間的所有日期進行檢查,然后再在數據庫中設置“已發送電子郵件”標志,以便您可以確認該電子郵件實際上是發送而不是盲目地相信腳本的有效性。
這應根據需要提供結果:
DATE_SUB(CURDATE(),INTERVAL 7 DAY) = expiry_date;
您可以參考下面的鏈接以獲取更多詳細信息:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
如果您需要告知檢查程序停止運行期間遺漏的行,請使用小標記來指示是否建議了該域。 在那之后,您必須選擇日期小於現在+ 7天的所有行,並將其標記為“不建議”。 發送電子郵件標簽后,它為“已建議”。 並且當他們將域標記續簽為“不建議”時。
$date=date('Y-m-d');
$date=date('Y-m-d', strtotime($date . ' + 7 day'));
//Now, use this query.
SELECT * from domain_names where status = '' or status = 'valid' and expiry_date = '{$date}';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.