MS SQL DATE操作与年度季节

时间:2016-05-11 18:00:32

标签: sql-server datetime

我有一个表格,其中包括Season和Academic_Year列。 Academic_Year是int类型。季节可以是春季,夏季或秋季。

  • 2016年秋季是2016年9月1日至2016年12月31日。
  • 2016年春季是2017年1月1日至2017年3月31日(不是错字 - 2016学年是2016年9月至2017年8月)
  • 2016年夏季是2017年4月1日至2017年8月31日

我需要在getdate()在赛季开始之前和之后的天数之间选择行,伪代码

WHERE 
    ( getdate() > 31/3/16 AND getdate() < 31/9/16 AND Season = 'Autumn' AND Academic_Year = 2016 )
    OR ( getdate() > 31/9/16 AND getdate() < 31/1/17 AND Season = 'Spring' AND Academic_Year = 2016 )
    OR ( getdate() > 31/12/16 AND getdate() < 31/4/17 AND Season = 'Summer' AND Academic_Year = 2016 )

我的问题是创建与getdate()进行比较的日期。我需要结合一个字符串 - &#39; 31/3 /&#39; - 使用int - Academic_Year,并创建日期。

解决方案不需要高效,但它确实需要在2008及更高版本的sql server版本上运行。

3 个答案:

答案 0 :(得分:0)

如果您只是连接varchar并告诉它转换为date,SQL将允许此转换。例如:

declare @year int = 2016
declare @date varchar(10) = '3/31'

select cast(@date + '/' + cast(@year as varchar(4)) as date)

您必须将integer年投放到varchar以将其与其他varchar相结合,但您可以将整个事项投射到date(或{ {1}})一旦你有一个公认的日期格式。

答案 1 :(得分:0)

您可以通过使用字符串和年份的串联来形成日期。

datetime

获得日期字符串后,您可以使用日期函数在必要时进一步操作它。

答案 2 :(得分:0)

WHERE (GETDATE() > CONVERT(VARCHAR(4),Academic_Year) + '-03-31'
    AND GETDATE() < CONVERT(VARCHAR(4),Academic_Year) + '-09-30'
    AND Season = 'Autumn') etc

为我工作。诀窍是添加'-03-31'而不是'31 -03-'。谢谢@kicken