SQL - 搜索表记录中不存在的日期时间段

时间:2011-09-28 10:36:01

标签: mysql sql performance

需要专家意见:

我正在尝试在我们的一个项目中实现一个场景,该场景根据用户输入显示图形,其中一个输入是日期时间范围。让我用一个例子来描述。

考虑一个包含start-date-time = 2011-09-28 9:30end-date-time = 2011-09-28 11:30的记录的示例。假设用户正在尝试查看日期时间范围2011-09-28 10:00 to 2011-09-28 11:00的图表 - 现在系统应显示图表,因为数据在给定时间段内可用(因为10 - 11在9.30 - 11.30之间)

如何实施此方案以及如何搜索此类输入?

注意: 特定日期/日期时间可能有太多行

感谢。

4 个答案:

答案 0 :(得分:1)

您可以使用:

SELECT * FROM your_table tb
WHERE 
  (  user_start_time <= tb.start_date_time AND 
     user_end_time >= tb.start_date_time
  ) OR (
     user_start_time <= tb.end_date_time AND 
     user_end_time >= tb.end_date_time
  ) OR (
     user_start_time >= tb.start_date_time AND 
     user_end_time <= tb.end_date_time
  )

答案 1 :(得分:1)

这取决于您是否需要确保用户输入的整个日期范围由表格中的图表覆盖。如果需要,则必须确保用户开始时间和用户结束时间都在数据库中的值之间。因此:

select * from graph_table t
where @user_start_time between t.graph_range_start and t.graph_range_end
and @user_end_time between t.graph_range_start and t.graph_range_end
limit 1;

你必须决定如何迎合回来的多行(我刚刚在这里使用了LIMIT 1)。

如果您想要带回任何涵盖用户开始时间或用户结束时间的图表,请将查询中的“和”更改为“或”,因此:

select * from graph_table t
where (@user_start_time between t.graph_range_start and t.graph_range_end)
or (@user_end_time between t.graph_range_start and t.graph_range_end)
limit 1;

同样,您必须在此处决定如何处理多个结果。

答案 2 :(得分:0)

试试这个:

SELECT * FROM TableName 
WHERE (@StartDate >=  start-date-time AND @StartDate <= end-date-time) 
OR 
(@EndDate >= start-date-time AND @EndDate <= end-date-time)

答案 3 :(得分:0)

SELECT * FROM your_table tb
WHERE NOT (
    tb.start_date_time > user_end_time 
  AND 
    tb.end_date_time < user_start_time
)

试试这个。 包含以下方案并返回结果:     条件(搜索间隔):     user_start_time = 2011-09-28 9:30和user_end_time = 2011-09-28 11:30

  • tb.start_date_time = 2011-09-28 08:30和tb.end_date_time = 2011-09-28 12:30
  • tb.start_date_time = 2011-09-28 10:30和tb.end_date_time = 2011-09-28 11:00
  • tb.start_date_time = 2011-09-28 10:30和tb.end_date_time = 2011-09-28 12:30
  • tb.start_date_time = 2011-09-28 08:30和tb.end_date_time = 2011-09-28 10:30

例外:

  • tb.start_date_time = 2011-09-28 07:30和tb.end_date_time = 2011-09-28 08:30
  • tb.start_date_time = 2011-09-28 12:30和tb.end_date_time = 2011-09-28 13:30