1

对于 Oracle 11g 数据库中的表:

CREATE TABLE mytable (START_DATE_TIME DATE, END_DATE_TIME DATE);
插入 MYTABLE (START_DATE_TIME,END_DATE_TIME) 值 (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'));
插入 MYTABLE (START_DATE_TIME,END_DATE_TIME) 值 (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'));
插入 MYTABLE (START_DATE_TIME,END_DATE_TIME) 值 (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'));
插入 MYTABLE (START_DATE_TIME,END_DATE_TIME) 值 (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'));
插入 MYTABLE (START_DATE_TIME,END_DATE_TIME) 值 (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
2013 年 6 月 20 日下午 01:30:00 2013 年 6 月 20 日下午 6:15:00
2013 年 6 月 21 日下午 06:45:00 2013 年 6 月 22 日上午 06:45:00
2013 年 6 月 23 日上午 06:45:00 2013 年 6 月 23 日晚上 10:30:00
2013 年 6 月 25 日上午 08:00:00 2013 年 6 月 25 日下午 5:30:00
2013 年 6 月 25 日下午 05:30:00 2013 年 6 月 26 日上午 05:30:00

我的目标是找出 END_DATE_TIME 和下一个最近的 START_DATE_TIME 之间的时间。

我的查询是:

选择开始日期时间,
  结束日期时间,
  ROUND((next_start_date - end_date_time)*24,2) hours_to_next_start
从
  (选择 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
  按 t.start_date_time 排序
  )

我得到了结果:

START_DATE_TIME END_DATE_TIME HOURS_TO_NEXT_START
2013 年 6 月 20 日下午 01:30:00 2013 年 6 月 20 日下午 6:15:00 24.5
2013 年 6 月 21 日下午 06:45:00 2013 年 6 月 22 日上午 06:45:00 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

据我所知,它工作正常。但是有些事情告诉我,如果没有选择中的辅助查询,可能会有更好的,或者至少是更新的方法来做到这一点?

你说什么?

4

2 回答 2

4

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 Fiddle 。要更深入地了解其工作原理,请尝试自行运行内部查询。

于 2013-06-28T19:03:10.217 回答
-1

使用此查询获取两个日期之间的差异小时数,这将返回为 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
)
于 2016-03-01T06:23:49.720 回答