2015-01-21 23 views
0

我的表中有兩個STRING字段,它們組成日期和時間。我想連接這些字段,將它們轉換爲日期,以便我可以在選定時間之間獲取值。我想我在查詢中遇到str_to_date格式的問題。下面是我在表中MySQL選擇查詢,concat並轉換爲日期兩個字段並與時間間隔進行比較

theDate  theTime 
Mon, Jan 20 7:00 pm 
Mon, Jan 20 9:00 pm 
Tue, Jan 21 5:00 pm 

的PHP:

date_default_timezone_set('EST'); 
//trying to set up the same format as the concatenated fields will be 
$now = date('D, M j g:i a'); 
include('..//db_connect.php'); 
try { 
    $stmt = $conn->query("SELECT * FROM table1 WHERE STR_TO_DATE(CONCAT(theDate, ' ', theTime), '%a, %b %e %l:%i %p') 
     BETWEEN (STR_TO_DATE('$now', '%a, %b %e %l:%i %p') - INTERVAL 4 HOUR AND STR_TO_DATE('$now', '%a, %b %e %l:%i %p') - INTERVAL 10 HOUR)"); 
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    print_r($results); 
} catch (Exception $e) { 
    echo $stmt."<br>".$e->getMessage(); 
} 

我得到的是語法錯誤near 'HOURS AND STR_TO_DATE('Wed, Jan 21 7:07', '%a, %b %e %l %i') - INTERVAL 10 HOURS' at line 2。查詢有什麼問題?另外,有沒有辦法打印查詢本身,查看連接的值,以查看格式化的值?

回答

1

有一點是錯誤的是小時。必須是小時

+0

現在我剛剛得到'...服務器版本的錯誤,以便在第2行附近使用正確的語法 – denikov 2015-01-21 12:35:15

0

我認爲您需要在某個地方通過...也是您在STR_TO_DATE時錯過了冒號:。這是小時奇異 嘗試這樣的:

// Assuming $now is in the format '2014 Wed, Jan 21 7:07' 
SELECT STR_TO_DATE('$now', '%Y %a, %b %e %l:%i') - INTERVAL 4 HOUR; 

按的問題,我想你可以做這樣的分離查詢的第二部分:

SELECT STR_TO_DATE('$now', '%Y %a, %b %e %l:%i') - INTERVAL 4 HOUR, STR_TO_DATE('$now', '%a, %b %e %l:%i %p') - INTERVAL 10 HOUR; 

然後顯示效果,看看正在查找的實際值是多少。

+0

我剛剛在第2行出現語法錯誤...... – denikov 2015-01-21 12:36:52

+0

更改括號的BETWEEN爲:'BETWEEN(STR_TO_DATE('$ now','%a,%b%e%l%i%p') - INTERVAL 4 HOUR)AND(STR_TO_DATE('$ now','%a, %b%e%l%i%p') - INTERVAL 10 HOUR)' – 2015-01-21 12:38:15

0

這是您的查詢:

SELECT * 
FROM table1 
WHERE STR_TO_DATE(CONCAT(theDate, ' ', theTime), '%a, %b %e %l %i %p') 
     BETWEEN (STR_TO_DATE('$now', '%a, %b %e %l %i %p') - INTERVAL 4 HOURS AND 
       STR_TO_DATE('$now', '%a, %b %e %l %i %p') - INTERVAL 10 HOURS) 

這並不完全像MySQL的句法。有幾個小問題 - hoursBETWEEN附近的括號,BETWEEN值錯誤。也許這是你想要的嗎?

SELECT * 
FROM table1 
WHERE STR_TO_DATE(CONCAT(theDate, ' ', theTime), '%a, %b %e %l %i %p') 
      BETWEEN date_sub(now(), interval 10 hours) AND 
        date_sub(now(), interval 4 hours); 

您應該在數據庫中使用本機類型的日期和時間,而不是將它們存儲爲字符串。如果他們是字符串,不要給他們名字,如「日期」和「時間」,這表明他們是不是他們的東西。

+0

我這樣做的原因是因爲表格中的值的格式。它們都是字符串,我想讓它們 – denikov 2015-01-21 12:40:15

+0

另外對於我的問題的第二部分...有沒有一種方法來回顯查詢本身,以查看搜索表時使用的格式化值? – denikov 2015-01-21 12:41:04

+0

@denikov ...。對於第二部分,只需在'select'子句中包含'str_to_date()'表達式。 – 2015-01-21 12:50:05

0

我猜你的錯誤是,你正在使用HOURS代替HOUR,但我建議一個更好的解決方案中使用date_sub()和MySQL now()方法到是這樣的:

SELECT * FROM table1 WHERE myDate BETWEEN date_sub(now(), INTERVAL 4 HOUR) AND date_sub(now(), INTERVAL 10 HOUR);

的其他sugestion是拯救日期時間字段爲datetime而不是string之後的工作量較少。

+0

我知道這樣保存會更好......這不是客戶端如何構建數據庫的方式。我無法控制值的保存方式 – denikov 2015-01-21 12:43:16

相關問題