[英]Is there a better way to write this Oracle SQL that deals with comparing dates in two different columns?
對於Oracle 11g數據庫中的表:
CREATE TABLE mytable (START_DATE_TIME DATE, END_DATE_TIME DATE); Insert into MYTABLE (START_DATE_TIME,END_DATE_TIME) values (to_date('06/20/2013 01:30:00 PM','MM/DD/YYYY HH:MI:SS AM'),to_date('06/20/2013 06:15:00 PM','MM/DD/YYYY HH:MI:SS AM')); Insert into MYTABLE (START_DATE_TIME,END_DATE_TIME) values (to_date('06/21/2013 06:45:00 PM','MM/DD/YYYY HH:MI:SS AM'),to_date('06/22/2013 06:45:00 AM','MM/DD/YYYY HH:MI:SS AM')); Insert into MYTABLE (START_DATE_TIME,END_DATE_TIME) values (to_date('06/23/2013 06:45:00 AM','MM/DD/YYYY HH:MI:SS AM'),to_date('06/23/2013 10:30:00 PM','MM/DD/YYYY HH:MI:SS AM')); Insert into MYTABLE (START_DATE_TIME,END_DATE_TIME) values (to_date('06/25/2013 08:00:00 AM','MM/DD/YYYY HH:MI:SS AM'),to_date('06/25/2013 05:30:00 PM','MM/DD/YYYY HH:MI:SS AM')); Insert into MYTABLE (START_DATE_TIME,END_DATE_TIME) values (to_date('06/25/2013 05:30:00 PM','MM/DD/YYYY HH:MI:SS AM'),to_date('06/26/2013 05:30:00 AM','MM/DD/YYYY HH:MI:SS AM'));
START_DATE_TIME END_DATE_TIME 06/20/2013 01:30:00 PM 06/20/2013 06:15:00 PM 06/21/2013 06:45:00 PM 06/22/2013 06:45:00 AM 06/23/2013 06:45:00 AM 06/23/2013 10:30:00 PM 06/25/2013 08:00:00 AM 06/25/2013 05:30:00 PM 06/25/2013 05:30:00 PM 06/26/2013 05:30:00 AM
我的目標是找到END_DATE_TIME和下一個最近的START_DATE_TIME之間的小時數。
我的查詢是:
SELECT start_date_time, end_date_time, ROUND((next_start_date - end_date_time)*24,2) hours_to_next_start FROM (SELECT t.start_date_time, t.end_date_time, (SELECT MIN(t2.start_date_time) FROM mytable t2 WHERE t2.start_date_time >= t.end_date_time ) next_start_date FROM mytable t ORDER BY t.start_date_time )
我得到了結果:
START_DATE_TIME END_DATE_TIME HOURS_TO_NEXT_START 06/20/2013 01:30:00 PM 06/20/2013 06:15:00 PM 24.5 06/21/2013 06:45:00 PM 06/22/2013 06:45:00 AM 24 06/23/2013 06:45:00 AM 06/23/2013 10:30:00 PM 33.5 06/25/2013 08:00:00 AM 06/25/2013 05:30:00 PM 0 06/25/2013 05:30:00 PM 06/26/2013 05:30:00 AM NULL
據我所知,它工作得很好。 但有些事情告訴我,如果沒有select中的二級查詢,可能會有更好的,或者至少更新的方式來做到這一點?
你說什么?
使用分析LEAD
功能,有一種更“現代”的方法。 我認為它更好,因為它更緊湊,加上一旦你習慣了分析功能,你會發現它們很容易閱讀 - 但這只是一個意見:)
SELECT
Start_Date_Time,
End_Date_Time,
ROUND((next_start_date - end_date_time)*24,2) hours_to_next_start
FROM (
SELECT
Start_Date_Time,
End_Date_Time,
LEAD(Start_Date_Time) OVER (ORDER BY Start_Date_Time) AS Next_Start_Date
FROM myTable
)
ORDER BY Start_Date_Time
有一個SQL小提琴這里 。 要更深入地了解其工作原理,請嘗試單獨運行內部查詢。
使用此查詢獲取兩個日期之間的差異時間,這將作為HH.MM返回
SELECT
CONCAT
(
DATEDIFF(MI,'06/20/2013 01:30:00 PM','06/20/2013 06:15:00 PM') / 60 ,'.', DATEDIFF(MI,'06/20/2013 01:30:00 PM','06/20/2013 06:15:00 PM') % 60
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.