2017-10-11 157 views
0

我有這樣的記錄:SQL,時間在時間​​戳

2017-07-24 16:59:32 
2017-07-24 17:53:38 
2017-07-24 22:26:08 
2017-07-24 23:04:54 
2017-07-25 08:33:43 
2017-07-25 10:06:47 

我想寫一個SQL查詢這僅僅比較時間戳的時間部分,例如:

SELECT * FROM table WHERE date BETWEEN '17:30:00' and '22:30:00' 

只檢查時間和忽略日期。是否有可能這樣做?

我使用MySQL

SELECT * FROM table WHERE hour('date') = 9; 

注意到整整一個小時,因爲我有時需要採取只需要一個小時的一半。

+2

使用'小時(日)和22' –

+3

17之間可能的複製[mysql - 按小時搜索時間戳](https://stackoverflow.com/questions/4865753/mysql-search-timestamp-by-hour-of-day) – matino

+0

在這種情況下,它顯示h要花一個小時,而不是一個全職。 – semkius

回答

1

這應該工作:

SELECT * FROM table 
WHERE 
(HOUR(date) BETWEEN 18 AND 21) OR 
(HOUR(date) = 17 AND MINUTE(date)>=30) OR 
(HOUR(date) = 22 AND MINUTE(date)<=30); 

或者另一種方法是將轉換爲DATE,添加小時和分鐘,然後用之間。

SELECT * FROM table 
WHERE date BETWEEN 
ADDDATE(ADDDATE(DATE(date), INTERVAL 17 HOUR), INTERVAL 30 MINUTE) 
AND 
ADDDATE(ADDDATE(DATE(date), INTERVAL 22 HOUR), INTERVAL 30 MINUTE); 
+0

錯誤1064(42000):您的SQL語法有錯誤;檢查對應於你的MySQL服務器版本的手冊,在第一行'''附近使用正確的語法 – semkius

+0

@semkius對不起,有一個多餘的支架。 – MatSnow

1

您可以將DATETIME轉換爲時間並在比較中使用該時間。

給出的樣本代碼:

CREATE TABLE Table1 
(
    Column1 VARCHAR(50), 
    Column2 VARCHAR(50), 
    Timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
); 

INSERT INTO 
Table1 
(Column1, Column2, Timestamp) 
VALUES 
('Valid', 'Time', '2017-01-01 17:43:01'), 
('Invalid', 'Time', '2017-01-01 16:00:43'); 

可以查詢它像以下內容:

SELECT 
    *, 
    DATE_FORMAT(`timestamp`, '%H:%i:%s') AS Time 
FROM 
    Table1 
WHERE 
    DATE_FORMAT(`timestamp`, '%H:%i:%s') BETWEEN '17:30:00' AND '22:30:00'; 

SQL Fiddle

+0

'17:30:00'和'08:30:00'之間; ,當我嘗試這個時,我只能在17:30到23:30之間得到,爲什麼呢? – semkius

+0

我不認爲你可以像這樣重疊午夜。您可能必須('17:30:00'和'23:59:59'之間)或('00:00:00'和'08:30:00'之間) – kchason