2013-01-22 39 views
0

我有一個名爲「reportinc」的表格,我必須從中提取-it是從1或過去的18:01(時間格式爲%H:%i)到今天的VARCHAR字段項目18:00。Mysql DATE_FORMAT和時間

我試圖與此查詢

SELECT `ID incidente`, `Data/ora apertura` 
FROM `reportinc` 
WHERE `Data/ora apertura` 
BETWEEN 
( 
SELECT date_format(now() - INTERVAL 1 
DAY , "%d/%m/%y at 18:01 ") 
) 
AND 
(
SELECT date_format(now() , "%d/%m/%y at 18:00 ") 

我想在18:01從昨天提取到今天18:00。 但結果是從昨天到今天00:00。 它不認爲18:00或18_01作爲有效的時間格式。 如何在查詢中指定時間?

再次感謝

+1

最好使用DATETIME類型而不是varchar。 –

+0

如果您使用varchar,則將您的日期轉換爲字符串值。張貼您的表格結構,以便我們可以看到是否是這種情況。如果您可以提供一些示例數據,可能有解決辦法。 –

+0

此SQL FIDDLE演示顯示了差異。 http://www.sqlfiddle.com/#!2/205da/20我必須跑,所以其他人可能會幫助你進一步。祝你好運。 –

回答

0

首先將格式從varchar更改爲有效的日期格式。 varchar將該值作爲字符串,您將不得不使用正則表達式來分割日期和時間。最好與以前的選擇一起去。

+0

日期從CMS導入CSV,不能導入爲DATE。 – svratonzo

+0

日期從CMS導入CSV,不能導入爲DATE。 這裏的標籤 ID incidente \t VARCHAR(14) Aperto公司噠\t VARCHAR(14) Stato \t VARCHAR(6) Categoria \t VARCHAR(17) 區\t VARCHAR(27) Sottoarea \t VARCHAR(36) TITOLO \t VARCHAR(255) Priorità\t VARCHAR(11) 數據/ ORA春季\t VARCHAR(17) 數據/奧拉risoluzione \t VARCHAR(20) 數據/ ORA chiusura \t VARCHAR(11) Inizio Interruzione二SERVIZIO \t VARCHAR(28) 精細interruzione二SERVIZIO \t VARCHAR(26) Conteggio riassegnazioni \t VARCHAR(24) 的**'數據/ ORA apertura' **字段包含類似: 31/07/2012 10.46 31/07/2012 10.47 – svratonzo

1

Data/ora apertura字段必須是DATETIME字段,或者您必須創建CAST。

然後,你必須這樣做:

SELECT `ID incidente`, `Data/ora apertura` 
FROM `reportinc` 
WHERE `Data/ora apertura` 
BETWEEN 
( 
    SELECT date_format(now() - INTERVAL 1 DAY , "%Y-%m-%d 18:01:00") 
) 
AND 
(
    SELECT date_format(now() , "%Y-%m-%d 18:00:00" 
) 

之間如你預期不工作時字段類型爲VARCHAR。

+0

轉換日期如何存檔? – svratonzo

+0

取決於。該字段已有數據,您無法刪除?如果有,則必須首先執行腳本或正則表達式將數據轉換爲正確的格式(YYYY-MM-DD HH:MM:SS),然後更改字段類型。如果沒有,請直接更改字段類型。但有一件事你必須記住每一次,如果你存儲的日期,該字段必須具有日期類型。 – artberri

0

編輯增加了更多具體的日期時間格式

我跑同樣的問題的時間和日期之間的結合。時間被忽略,因此您可以從整天獲得結果。

嘗試使用PHP或其他編程語言來操縱MySQL。或者嘗試按照我的建議更改CSV文件的導入方法。

SELECT *,CAST((STR_TO_DATE(`Data/ora apertura`, '%d/%m/%Y %H.%i')) AS DATETIME) 
AS DATE_TIME 
FROM reportinc 
WHERE (CAST((STR_TO_DATE(`Data/ora apertura`, '%d/%m/%Y %H.%i')) AS DATETIME)) >= ('2012-22-01 21:00'); 

SELECT *,CAST((STR_TO_DATE(`Data/ora apertura`, '%d/%m/%Y %H.%i')) AS DATETIME) 
AS DATE_TIME 
FROM reportinc 
WHERE (STR_TO_DATE(`Data/ora apertura`, '%d/%m/%Y %H.%i')) >= ('2012-22-01 21:00'); 

的樣本數據:

CREATE TABLE reportinc (
    `ID_incidente` int auto_increment primary key, 
    `Data/ora apertura` varchar(30) 
); 


INSERT INTO reportinc (`Data/ora apertura`) 
VALUES 
("31/07/2012 10.46"), 
("31/07/2012 10.47"), 
("22/01/2013 20.00"), 
("23/01/2013 10.00"); 

SQL FIDDLE demo ---

試着這麼做:

使用CAST功能:

SELECT * FROM reportinc WHERE (CAST(`Data/ora apertura` AS DATETIME)) >= NOW() - INTERVAL 3 hour; 

使用STR_TO_DATE功能:

SELECT * FROM reportinc WHERE (STR_TO_DATE(`Data/ora apertura`,'%Y-%m-%d %H:%i:%s')) >= NOW() - INTERVAL 3 hour; 

你是一個有點不清楚了時間範圍,所以我花了3小時,因爲一個例子。您還可以使用特定的日期和時間。

使用投:

`SELECT * FROM reportinc WHERE (CAST(`Data/ora apertura` AS DATETIME)) >= ('2013-01-22 20:00:00');` 

使用STR_TO_DATE

SELECT * FROM reportinc WHERE (STR_TO_DATE(apertura, '%Y-%m-%d %H:%i:%s')) >= ('2013-01-21 20:00:00'); 

的樣本數據:

CREATE TABLE reportinc (
    `ID_incidente` int auto_increment primary key, 
    `Data/ora apertura` varchar(30), 
    `Data/ora apertura1` datetime 
); 


INSERT INTO reportinc (`Data/ora apertura`, `Data/ora apertura1`) 
VALUES (NOW() - INTERVAL 1 day, NOW() - INTERVAL 1 day), 
(NOW() - INTERVAL 1 hour, NOW() - INTERVAL 1 hour), 
(NOW() - INTERVAL 3 hour, NOW() - INTERVAL 3 hour), 
(NOW() - INTERVAL 6 hour, NOW() - INTERVAL 6 hour), 
(NOW() - INTERVAL 9 hour, NOW() - INTERVAL 9 hour), 
(NOW() - INTERVAL 1 year, NOW() - INTERVAL 1 year); 

SQL FIDDLE DEMO

B.T.W.我的建議是停止在列和表名稱中使用斜槓,空格等。

我會很感激,如果你會接受幫助你的答案。

+0

我認爲最好的方式我起訴這個查詢 – svratonzo

+0

所有查詢顯示0結果 – svratonzo

+0

@svratonzo你能提供表結構和一些示例數據嗎?你可以用'SHOW CREATE TABLE reportinc;'創建表結構。 –