选择午夜时分的两次(分钟)

时间:2016-08-17 19:35:25

标签: sql oracle

我需要从一个时间(例如23:00到02:00)之间的日期选择寄存器,但我不知道如何详细说明该情况的选择。

我有两个字段(整数值),只有一个字段用于日期。 日期字段不记录时间戳,它是我使用的那个应用程序,并且没有任何关于它的事情。时间记录在两个字段中(“开始时间”和“结束时间”),有时“结束时间”跨越午夜。

date                | start time | end time
16-08-2016 00:00:00 | 1420       | 90

时间以分钟为单位,因此start time23:40end time01:30

我的选择开始变大,我担心我所做的事情是错误的。

编辑 - 查询:

SELECT * FROM TABLE WHERE (((1320 >= StartTime OR 1320 <= EndTime) AND EndTime < StartTime AND MyDate <= '17/08/2016') OR
         ((1350 >= StartTime OR 1350 <= EndTime) AND EndTime < StarTime AND MyDate <= '17/08/2016'))

3 个答案:

答案 0 :(得分:1)

   select date, starttime, DATEADD(mi, endtime,Dateadd(mi,starttime, cast(date     as datetime))) AS Enddatetime
   FROM yourtable

答案 1 :(得分:1)

我在顶部的变量中放置了您正在寻找的内容,因此您只需输入一次。您可以将它们与转换逻辑一起嵌入查询中,但它很麻烦。

declare @date datetime, @start int, @end int
select @date = '17/8/2016', @start = 1425, @end = 15

-- convert minutes past midnight
select @end = @end + case when @start > @end then 1440 else 0 end

select  *
from    Table
where   MyDate = @date
    and StartTime between @start and @end
    and EndTime + case when StartTime > EndTime then 1440 else 0 end between @start and @end

这将查找在指定时间内开始和结束的所有寄存器。如果您还需要找到在时间段内运行但在之前,之后或之后开始运行的那些,或者两者兼而有之,请使用以下where子句。

where   MyDate = @date
    and StartTime < @end
    and EndTime + case when StartTime > EndTime then 1440 else 0 end > @start

答案 2 :(得分:1)

使用您拥有的字段计算起始点和结束点作为Oracle DATE(包括日期和时间)。然后根据任何其他DATE列进行过滤。

像这样:

SELECT * FROM
(
-- This inline view gets everything in your table, plus the start_datetime and end_datetime as calculated from your various fields.
SELECT your_table.*, start_date + ( start_time / 1440 ) start_datetime, start_date + case when end_time < start_time then end_time + 1440 else end_time end end_datetime FROM your_table
) 
WHERE start_datetime between ... whatever date range you want ...
AND end_datetime between ... whatever date range you want ...