SQL:查询给定日期的时间段

时间:2017-03-14 11:30:37

标签: mysql sql

我有一年中的期间列表,每年都是一样的。你可以把它想象成一个季节。他们有一个startDate和一个endDate。

因为可以有季节相互跳跃,我需要查询所有匹配的季节给定日期,无论哪一年

举个例子:

第1季:从1月1日到1月10日 第2季:1月6日至1月8日 第3季:1月11日至1月20日

鉴于1月7日,我需要检索Season1和Season2。

我已尝试将所有日期转换为同一年,但在“晚于”结束日期的某个季节的开始日期时(例如,有一段时间从11月开始到2月结束) )。

提前感谢您的帮助。

编辑,示例数​​据:

StartDate   EndDate     SeasonId
2000-08-01  2000-08-31  4
2000-12-29  2000-01-02  3
2000-06-01  2000-07-30  3
2000-09-01  2000-09-30  3
2000-01-06  2000-01-08  3
2000-04-07  2000-04-17  3
2000-04-28  2000-05-01  3
2000-06-02  2000-06-05  3
2000-06-23  2000-06-25  3
2000-09-08  2000-09-11  3
2000-09-22  2000-09-25  3
2000-10-12  2000-10-15  3
2000-11-01  2000-11-05  3
2000-12-01  2000-12-10  3
2000-12-22  2000-12-26  3
2000-03-01  2000-05-31  2
2000-10-01  2000-10-31  2
2000-11-01  2000-02-28  1

我需要,例如,日期为2000-02-08的季节,并检索seasonId = 1,或者2000-10-13和后退seasonId = 3, seasonId = 2

4 个答案:

答案 0 :(得分:1)

给定tblSeason列Id,startdate,enddate和你的日期为@myDate,你会查询为

Select Id From tblSeason WHERE @myDate BETWEEN startdate AND enddate

会列出匹配季节的Id列表。

如果您无法解决此问题,请在示例中提供有关您查询的结构和预期结果的更多信息。 *编辑忽略你可以做的年份部分

    Declare @myDate datetime = '2016-10-13'

SELECT [StartDate]
      ,[EndDate]
      ,[SeasonId]
  FROM [dbo].[Table_1]
  where DATEPART(dy, @myDate) >= DATEPART(dy,StartDate)
  AND (DATEPART(dy,@myDate) =< DATEPART(dy,EndDate) OR DATEPART(dy,StartDate) > DATEPART(dy,EndDate))

答案 1 :(得分:1)

您可以在第1季查询:

select * from myTable where (month(myDate) = 1 and DAY(myDate) between 1 and 10)

如果您有超过一个月的季节,例如开始日期1月20日,结束日期Febrery 10th,您可以这样查询:

select * from myTable where (month(myDate) = 1 and DAY(myDate) >= 20) or (month(myDate) = 2 and DAY(myDate) <= 10)

更新了您的更新

这有点棘手,但应该有用......

select *  from seasons_table
where cast(cast(day(myDate) as char) + '/' + cast(month(myDate) as char)  + '/' + '2000' as date) between
 cast(cast(day(StartDate) as char) + '/' + cast(month(StartDate) as char)  + '/' + '2000' as date) and
 cast(cast(day(EndDate) as char) + '/' + cast(month(EndDate) as char)  + '/' + '2000' as date)

答案 2 :(得分:1)

我会在2&#39;选项中执行此操作(以下SQL假设您已经摆脱了表中的年份,并且只保留了月份日期格式。)

 select ... from seasons s where 
    (s.startDate <= s.endDate and s.startDate <= @mydate and s.endDate >= @mydate) or 
    (s.startDate > s.endDate and s.startDate >= @mydate and s.endDate <= @mydate)

答案 3 :(得分:1)

为什么你把年份列入表格?这看起来很奇怪。

在任何情况下,您只关心MM-DD格式,因此请使用<ul class="nav nav-tabs"> <li class> <div> <a href="#logo"></a> </div> </li> <li class = "active"></li> <li class></li> </ul> <div id="logo"> </div> 将值转换为字符串:

date_format()

字符串可以进行比较,因为您只查看日期的月和日组件。

鉴于问题的性质,我建议您将select t.* from t where (start_date <= end_date and date_format(@date, '%m-%d') >= date_format(start_date, '%m-%d') and date_format(@date, '%m-%d') <= date_format(end_date, '%m-%d') ) or (start_date > end_date and date_format(@date, '%m-%d') <= date_format(start_date, '%m-%d') and date_format(@date, '%m-%d') >= date_format(end_date, '%m-%d') ); start_date存储为非日期格式,例如MM-DD。