2017-10-11 150 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