[英]MySQL datetime comparison
這是我的問題:
我的mysql數據庫中有一個表,其中包含一些產品,並且它有兩列稱為“ date_from”和“ date_to”,它們確定產品處於活動狀態的期限。
在我的網站上,有一個表單,管理員可以選擇兩個日期時間值,並且如果產品的有效期與管理員選擇的跨度相交,則頁面將更新產品列表。
這是我的查詢,我正在使用它來實現所需的功能:
$sql="SELECT * FROM presents WHERE (date_from>".$date_from." AND date_to<".$date_to.") OR (date_from>".$date_from." AND date_to>".$date_to.") OR (date_from<".$date_from." AND date_to>".$date_to.") OR (date_from<".$date_from." AND date_to<".$date_to.")";
我收到此錯誤:
mysql說:MySql錯誤號:1064 MySql錯誤說明:您的SQL語法有錯誤。 請查看與您的MySQL服務器版本相對應的手冊,以獲取在'.26附近使用的正確語法。 12:11:43 AND date_to <2012.07.30。 12:11:46)OR(date_from> 2012.07.26。12:11:'在第1行
有任何想法嗎?
*編輯
我按照建議更改了查詢,並在變量中添加了單引號。 現在我沒有收到錯誤,但是查詢似乎並沒有執行預期的操作-產品列表保持不變...現在是查詢:
$sql="SELECT * FROM presents WHERE (date_from>'".$date_from."' AND date_to<'".$date_to."') OR (date_from>'".$date_from."' AND date_to>'".$date_to."') OR (date_from<'".$date_from."' AND date_to>'".$date_to."') OR (date_from<'".$date_from."' AND date_to<'".$date_to."')";
假設我的表格中有這一行:
ID名稱date_from date_to
1次測試2012-07-24 16:40:00 2012-07-31 16:40:00
我需要所有這些時間段來返回該行:
2012-07-23 16:40:00至2012-08-01 16:40:00
2012-07-23 16:40:00至2012-07-28 16:40:00
2012-07-26 16:40:00至2012-07-28 16:40:00
2012-07-26 16:40:00至2012-08-01 16:40:00
您需要引用您的變量。
但是最好不要使用concat sql,而應使用占位符。
我確定您需要將日期用單引號引起來:
date_from > '".$date_from."' AND
您應該將日期括在引號中,例如'".$date_from."'
編輯:嘗試:
$sql="SELECT * FROM presents WHERE '".$date_from."' BETWEEN date_from AND date_to";
如日期和時間文字中所述 :
MySQL可以使用以下格式識別
DATETIME
和TIMESTAMP
值:
作為
'YYYY-MM-DD HH:MM:SS'
或'YY-MM-DD HH:MM:SS'
格式的字符串。 這里也允許使用“寬松”語法:任何標點符號都可以用作日期部分或時間部分之間的分隔符。 例如'2012-12-31 11:30:45'
,'2012^12^31 11+30+45'
,'2012/12/31 11*30*45'
和'2012@12@31 11^30^45'
是等效的。如果字符串不帶分隔符,則格式為
'YYYYMMDDHHMMSS'
或'YYMMDDHHMMSS'
,但前提是該字符串應作為日期使用。 例如,'20070523091528'
和'070523091528'
被解釋為'2007-05-23 09:15:28'
,但是'071122129015'
是非法的(具有無意義的分鍾部分),並變為'0000-00-00 00:00:00'
。如果數字是日期,
YYMMDDHHMMSS
YYYYMMDDHHMMSS
或YYMMDDHHMMSS
格式表示。 例如,19830905132800
和830905132800
被解釋為'1983-09-05 13:28:00'
。
如果使用字符串格式,則必須確保正確引用了字符串。
您以string
形式傳遞日期時間,因此需要使用單引號將它們引號,如下所示:
... (date_from<'".$date_from."' AND date_to>'".$date_to."') ...
或者,您可以將使用的變量的格式更改為數字(采用YYYYMMDDHHmmss
形式),然后不必使用引號
嘗試使用其他類似的語法:
WHERE OrderDate BETWEEN '01/01/2006' AND '01/02/2006'
資料來源: http : //www.demiliani.com/blog/archive/2006/01/19/3384.aspx
這是為您提供的完整的SQL版本:)。 我已經使用您提到的字段創建了測試表,並且此SQL對我來說非常完美-
$sql="SELECT * FROM presents WHERE (date_from > STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to < STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s')) OR (date_from > STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to > STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s') ) OR (date_from < STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to > STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s')) OR (date_from < STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to <STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s'))";
附上我在phpMyAdmin-中運行SQL時得到的信息
讓我知道您是否對此有任何疑問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.