2012-09-06 43 views
-1

我有一個mysql表,它有一個存儲日期但不是日期格式的列,它是一個varchar。mysql在最近日期/小時之前或之後的順序

該列被稱爲data_hora,日期格式爲dd/mm/yy,例如:06/09/2012 15:00,所以我不得不在mysql查詢中轉換爲日期格式。

我需要在當前時間之前或之後得到最近的日期和時間,我想出了下面的代碼,但由於某種原因,它似乎只得到最接近的日期,但不是小時,很奇怪?!?!

SELECT str_to_date(data_hora, '%d/%m/%Y %H:%i') AS data_hora 
FROM requisicoes 
ORDER BY abs(DATE_FORMAT(NOW(),'%d/%m/%Y %H:%i') - data_hora) LIMIT 1 

幫助:(

+0

不要忘記在where子句來提高性能時間條件:'這裏DATE_ADD(NOW之間data_hora() INTERVAL -1 HOUR)和DATE_ADD(NOW(),INTERVAL 1 HOUR)' – danihp

+0

@danihp:全表掃描和每個字符串到時間戳的轉換仍然是必需的。排序和限制將同樣有效;在這種情況下,執行過濾器實際上只會增加額外的開銷。 – eggyal

+0

@eggyal,當然!我認爲data_hora是一個時間領域......但不是! – danihp

回答

3

試試這個:

你的ORDER BY子句改變

SELECT str_to_date(data_hora, '%d/%m/%Y %H:%i') AS data_hora 
FROM requisicoes 
ORDER BY abs(TIMEDIFF(NOW() , str_to_date(data_hora, '%d/%m/%Y %H:%i'))) LIMIT 1 
+0

'TIMEDIFF'返回的'TIME'值限制在'-838:59:59'到'838:59:59'的範圍內:這對於OP的需求來說可能足夠也可能不足夠。雖然對於時間參數不是線性的,但ABS()的結果確實是一個嚴格遞增的整數,因此它可以工作 - 但我不認爲這是一個很好的依賴。 – eggyal

+0

拯救了我的生命:) – SGomes

1

你不應該格式化NOW()字符串:它已經是一個TIMESTAMP值;相反,利用本UNIX_TIMESTAMP(),而且data_hora之間的(絕對)差別名您選擇STR_TO_DATE()柱:

ORDER BY ABS(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(data_hora)) 

如果可能的話,我會建議改變你的模式,使您的data_hora列存儲爲TIMESTAMP:它將大大提高此類查詢的性能。

相關問題