簡體   English   中英

MySQL日期時間比較

[英]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說:My​​Sql錯誤號: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可以使用以下格式識別DATETIMETIMESTAMP值:

  • 作為'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 YYYYMMDDHHMMSSYYMMDDHHMMSS格式表示。 例如, 19830905132800830905132800被解釋為'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM