我有一年中的期间列表,每年都是一样的。你可以把它想象成一个季节。他们有一个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
答案 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。