我需要从一个时间(例如23:00到02:00)之间的日期选择寄存器,但我不知道如何详细说明该情况的选择。
我有两个字段(整数值),只有一个字段用于日期。 日期字段不记录时间戳,它是我使用的那个应用程序,并且没有任何关于它的事情。时间记录在两个字段中(“开始时间”和“结束时间”),有时“结束时间”跨越午夜。
date | start time | end time
16-08-2016 00:00:00 | 1420 | 90
时间以分钟为单位,因此start time
为23:40
而end time
为01: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'))
答案 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 ...