2009-12-22 160 views
1

我有一個問題讓我的數據返回。我有兩次沒有日期在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 

回答

2

請注意'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 

我認爲這看起來是正確的。

+0

啊......這就是我的想法。我嘗試過,但我無法正確理解。所以,我必須對這個等式進行評估......謝謝你的解釋,這真的很有幫助。 – hal 2009-12-22 03:22:08

+0

Jonathan,感謝您對這段偉大代碼的清理。不幸的是,它不會產生正確的輸出。我沒有得到任何東西,而你的第一個代碼段工作。我會看看我能否弄清楚。再次感謝你。 – hal 2009-12-22 03:46:17

+0

我想我應該真的顯示zdate值23:59:59和00:00:01。他們每個出現兩次 - 一次是區域'09:00' - '02:00',一次是區域'21:00' - '04:00'。 – 2009-12-22 05:55:57

0

18:21如果轉換爲12小時時間的下午6點21分你上午9:00比較凌晨2:00這是荒謬的,所以肯定你不會得到任何結果。

除非你的意思是第二天凌晨2點......那麼這是另一個問題。

+0

我會如何比較兩次,例如在我的情況下,關閉時間是在午夜之後,開始時間在哪? – hal 2009-12-22 02:58:12

1

你的問題是,你的「日界」不是午夜,而是白天的其他一些點。不幸的是,由於你的專欄僅存儲時間,所以在任何給定時間都不可能知道它是指今天還是明天(或其他日子)。正確的解決方案是存儲完整的日期和時間,以便您的比較有意義。

如果這是不可能的,那麼您必須確定您的數據是否允許確定一致的日邊界。有效的日期邊界可能會導致您的時間間隔沒有交叉。如果存在這樣的時間點,則可以在比較之前通過該偏移量調整所有時間值。例如,如果您決定09:00(上午9點)是有效邊界,那麼只需從兩個時間中減去9個小時,這將使它們在相同的24小時內都可以進行直接比較。

+0

我同意你的看法,因爲如果我有一天,計算起來會更容易。 Johathan的建議也很有魅力。 我的項目,不應該有任何時間的邊界,如午夜標記。只要時間跨度在從開始到結束的24小時範圍內,這就是我所需要的。我希望喬納森的建議能夠涵蓋這一點。 – hal 2009-12-22 03:28:23