我有一個問題讓我的數據返回。我有兩次沒有日期在00:00:00,我試圖比較它們。目前的準時時間是09:00:00,關閉時間目前是02:00:00。比較時間,因爲在我的SQL是18:21:00之間的開關時間,但我無法得到結果。兩個時間戳之間的MySQL差異
這裏是我的SQL:
SELECT zdate
FROM zones
WHERE '18:21:00' BETWEEN time_on AND time_off
我有一個問題讓我的數據返回。我有兩次沒有日期在00:00:00,我試圖比較它們。目前的準時時間是09:00:00,關閉時間目前是02:00:00。比較時間,因爲在我的SQL是18:21:00之間的開關時間,但我無法得到結果。兩個時間戳之間的MySQL差異
這裏是我的SQL:
SELECT zdate
FROM zones
WHERE '18:21:00' BETWEEN time_on AND time_off
請注意'x BETWEEN y AND z
'假設爲y
小於z
;否則它永遠不會返回任何東西它相當於'x >= y AND x <= z
'。
鑑於截止時間爲午夜在這種情況下後,那麼你就需要做一個更復雜的情況:
SELECT zdate
FROM zones
WHERE (time_on < time_off AND '18:21:00' BETWEEN time_on AND time_off)
OR (time_on > time_off AND ('18:21:00' > time_on OR '18:21:00' < time_off))
第一個條件是正常的一個時間上是在同一天,休假。第二個替代方案檢查目標時間是否在時間之後(並且在午夜之前隱含)或者是在時間之前(以及因此在午夜和休息之間)之前。
對於更大的對稱性:
SELECT zdate
FROM zones
WHERE (time_on < time_off AND ('18:21:00' > time_on AND '18:21:00' < time_off))
OR (time_on > time_off AND ('18:21:00' > time_on OR '18:21:00' < time_off))
在MacOS X 10.6.2使用IBM的Informix動態服務器(IDS)11.50.FC4W1示例輸出。 IDS使用'DATETIME HOUR TO SECOND'作爲標準SQL中TIME類型的等價物。
CREATE TEMP TABLE zones
(
time_on DATETIME HOUR TO SECOND NOT NULL,
time_off DATETIME HOUR TO SECOND NOT NULL
);
INSERT INTO zones VALUES ('09:00:00', '02:00:00');
INSERT INTO zones VALUES ('07:00:00', '19:00:00');
INSERT INTO zones VALUES ('20:00:00', '22:00:00');
INSERT INTO zones VALUES ('10:00:00', '15:15:00');
INSERT INTO zones VALUES ('21:00:00', '04:00:00');
CREATE TEMP TABLE times
(
zdate DATETIME HOUR TO SECOND NOT NULL
);
INSERT INTO times VALUES ('18:21:00');
INSERT INTO times VALUES ('08:30:00');
INSERT INTO times VALUES ('20:30:00');
INSERT INTO times VALUES ('12:30:00');
SELECT zdate, time_on, time_off
FROM zones CROSS JOIN times
WHERE (time_on < time_off AND (zdate > time_on AND zdate < time_off))
OR (time_on > time_off AND (zdate > time_on OR zdate < time_off))
ORDER BY zdate, time_on, time_off
輸出數據:
08:30:00 07:00:00 19:00:00
12:30:00 07:00:00 19:00:00
12:30:00 09:00:00 02:00:00
12:30:00 10:00:00 15:15:00
18:21:00 07:00:00 19:00:00
18:21:00 09:00:00 02:00:00
20:30:00 09:00:00 02:00:00
20:30:00 20:00:00 22:00:00
我認爲這看起來是正確的。
18:21如果轉換爲12小時時間的下午6點21分你上午9:00比較凌晨2:00這是荒謬的,所以肯定你不會得到任何結果。
除非你的意思是第二天凌晨2點......那麼這是另一個問題。
我會如何比較兩次,例如在我的情況下,關閉時間是在午夜之後,開始時間在哪? – hal 2009-12-22 02:58:12
你的問題是,你的「日界」不是午夜,而是白天的其他一些點。不幸的是,由於你的專欄僅存儲時間,所以在任何給定時間都不可能知道它是指今天還是明天(或其他日子)。正確的解決方案是存儲完整的日期和時間,以便您的比較有意義。
如果這是不可能的,那麼您必須確定您的數據是否允許確定一致的日邊界。有效的日期邊界可能會導致您的時間間隔沒有交叉。如果存在這樣的時間點,則可以在比較之前通過該偏移量調整所有時間值。例如,如果您決定09:00(上午9點)是有效邊界,那麼只需從兩個時間中減去9個小時,這將使它們在相同的24小時內都可以進行直接比較。
我同意你的看法,因爲如果我有一天,計算起來會更容易。 Johathan的建議也很有魅力。 我的項目,不應該有任何時間的邊界,如午夜標記。只要時間跨度在從開始到結束的24小時範圍內,這就是我所需要的。我希望喬納森的建議能夠涵蓋這一點。 – hal 2009-12-22 03:28:23
啊......這就是我的想法。我嘗試過,但我無法正確理解。所以,我必須對這個等式進行評估......謝謝你的解釋,這真的很有幫助。 – hal 2009-12-22 03:22:08
Jonathan,感謝您對這段偉大代碼的清理。不幸的是,它不會產生正確的輸出。我沒有得到任何東西,而你的第一個代碼段工作。我會看看我能否弄清楚。再次感謝你。 – hal 2009-12-22 03:46:17
我想我應該真的顯示zdate值23:59:59和00:00:01。他們每個出現兩次 - 一次是區域'09:00' - '02:00',一次是區域'21:00' - '04:00'。 – 2009-12-22 05:55:57