有没有更好的方法来编写这个处理比较两个不同列中的日期的 Oracle SQL?
Posted
技术标签:
【中文标题】有没有更好的方法来编写这个处理比较两个不同列中的日期的 Oracle SQL?【英文标题】:Is there a better way to write this Oracle SQL that deals with comparing dates in two different columns? 【发布时间】:2013-06-28 18:53:12 【问题描述】:对于 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据我所知,它工作正常。但是有些事情告诉我,如果没有选择中的辅助查询,可能有更好的或至少更新的方法?
你说什么?
【问题讨论】:
【参考方案1】:使用解析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 here。要更深入地了解其工作原理,请尝试自行运行内部查询。
【讨论】:
啊哈当然是 LEAD 命令……我真的需要拥抱分析函数。我最近熟悉 LEAD 命令。我想我需要更多的经验或想象力才能更多地使用它们。谢谢你的例子。【参考方案2】:使用此查询获取两个日期之间的差异小时数,这将返回为 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
)
【讨论】:
以上是关于有没有更好的方法来编写这个处理比较两个不同列中的日期的 Oracle SQL?的主要内容,如果未能解决你的问题,请参考以下文章
有没有更好的方法来处理 Android 中的 CRUD 操作?