【发布时间】:2021-07-15 07:28:40
【问题描述】:
我的视图中有这些数据
ID event_start event_end
499 2021-07-13 00:00:00.000 2021-07-13 00:00:00.000
499 2021-07-15 00:00:00.000 2021-07-15 00:00:00.000
499 2021-07-14 05:00:00.000 2021-07-14 06:00:00.000
499 2021-07-14 02:00:00.000 2021-07-14 03:00:00.000
499 2021-07-14 07:00:00.000 2021-07-14 09:00:00.000
所以我有@date_start 和@date_end 的参数,并想像这样选择:
DECLARE @date_start datetime2 = '2021-07-14 07:00', @date_end datetime2 = '2021-07-14 08:10'
Select ID, t1.event_start, t1.event_end from Table1
WHERE event_start >= @date_start AND event_end <= @date_end
AND ID=499
这不会给我返回结果。但我的目标是获得最后一行。
499 2021-07-14 07:00:00.000 2021-07-14 09:00:00.000
因为这一行从 7 开始,到 9 结束,这将涵盖 @date_start 和 @date_end 期间。我怎么能这样做?
如果我把@date_start 和@date_end 改成这样:
DECLARE @date_start datetime2 = '2021-07-14', @date_end datetime2 = '2021-07-14'
它应该返回
499 2021-07-14 05:00:00.000 2021-07-14 06:00:00.000
499 2021-07-14 02:00:00.000 2021-07-14 03:00:00.000
499 2021-07-14 07:00:00.000 2021-07-14 09:00:00.000
因为这三行都发生在同一天,只是时间不同。
谢谢
【问题讨论】:
-
当您实际上希望给定范围落入行范围时,您当前正在要求行范围落入给定范围内。因此:
WHERE @date_start >= event_start AND @date_end <= event_end如果我没记错的话。 -
是的,在一种情况下有效。但是当我的 start_date 和 end_date 没有时间时,它在第二种情况下不起作用。
-
正确。这不适用于第二个示例,因为给定的范围表示午夜(没有时间的日期被解释为 00:00:00)。如果给定的范围是一整天(00:00 - 23:59'),那么任何行都不会覆盖该范围。
-
我认为您必须准确定义要应用的规则,因为显然有时您想要覆盖的范围,而其他时候则不需要。似乎如果给出了两个日期时间(即两者中至少有一个的时间 > 00:00?),那么给定的范围必须完全适合行范围。如果只给出日期(没有时间部分或时间 = 00:00),那么行范围必须至少包含两个给定日期中的每一个日期的一秒?把规则定义准确,然后一步步放到SQL里面。
-
不清楚是希望参数中的日期范围在表格中的日期范围内,还是希望表格中的日期范围在参数范围内,还是希望表中与参数重叠(甚至部分重叠)的任何日期范围。这是三种不同的东西,要清楚自己想要哪一种。
标签: sql sql-server tsql