2011-01-17 73 views
9

Điều này có thể là không thể theo cách mà tôi muốn có nó hoạt động, nhưng ở đây đi.MySQL: So sánh GIỮA thời gian

SELECT * FROM `table` WHERE CAST('05:00:00' AS time) BETWEEN `start` AND `end` 

Các mục trong cơ sở dữ liệu bao gồm:

`start` = '22:59:59' 
`end` = '06:00:00' 

Tuy nhiên, truy vấn trả về không có kết quả. Tất nhiên, điều này sẽ làm việc nếu có ngày tham gia, tuy nhiên không có. Nó cũng sẽ hoạt động nếu bắt đầu là = '00: 00: 00 '.

+1

Vì vậy, thời gian trong ngày quan trọng, không phải là ngày? Chia thành hai phần (... giữa '00: 00: 00 'và '06: 00: 00') hoặc (giữa '22: 59: 59 'và '23: 59: 59') có lẽ? –

+0

... Hoặc đảo ngược logic và làm cho nó KHÔNG GIỮA '06: 00: 00 'VÀ '22: 59: 59'? –

+0

Không nghĩ về điều đó, chắc chắn là một cách để làm điều đó, logic chỉ không có ý nghĩa trong bối cảnh của ứng dụng. Cảm ơn bạn đã gợi ý, có thể là tùy chọn duy nhất. – jmyz

Trả lời

17

tôi nghĩ rằng những gì bạn đang tìm kiếm là:

SELECT * FROM table WHERE start < CAST('05:00:00' AS time) AND end > CAST('05:00:00' AS time) 

Tôi không chắc chắn nếu bạn cần phải sử dụng CAST s, mặc dù điều này cũng nên làm việc.

SELECT * FROM table WHERE start < '05:00:00' AND end > '05:00:00' 
+0

Một điểm quan trọng cần nhớ ở đây là nếu thời gian của bạn được định dạng theo định dạng 24 giờ, bạn cần phải khớp nó trong truy vấn, vì vậy ở trên có thể nhiều hơn "SELECT * FROM table WHERE start CAST ('17: 00: 00' AS thời gian) '" – Chiwda

13
SELECT * 
FROM `table` 
WHERE CAST('05:00:00' AS time) BETWEEN `start` AND `end` 
     OR (NOT CAST('05:00:00' AS time) BETWEEN `end` AND `start` AND `start` > `end`) 
+0

một winrar là bạn –

+1

bạn là genious! nó phải được đánh dấu là câu trả lời thay vì câu trả lời hiện tại! –

4

Tôi vừa bắt gặp câu hỏi này và tôi đã có cùng một vấn đề. Giải pháp của tôi là như sau:

SET @time = '05:00:00'; 

SELECT * FROM `table` 
WHERE IF(
     `start` < `end`, 
     CAST(@time AS TIME) BETWEEN `start` AND `end`, 
     (CAST(@time AS TIME) BETWEEN CAST('00:00:00' AS TIME) AND `end`) OR 
     (CAST(@time AS TIME) BETWEEN `start` AND CAST('24:00:00' AS TIME)) 
    ) = 1; 

Hy vọng nó sẽ giúp ai đó trong tương lai.

Cảm ơn Martin vì gợi ý!

1

Chúng tôi có thể so sánh thời gian bằng cách sử dụng chức năng đơn giản thời gian tới giây. Sử dụng các mục sau:

SELECT id 
FROM table1 
WHERE TIME_TO_SEC('2014-03-05 04:17:47') >= TIME_TO_SEC('2014-03-05 04:17:47'); 
Các vấn đề liên quan