如何为日历报告执行运行年份?

时间:2009-02-09 18:10:08

标签: date

以下是我正在使用的查询:

SELECT * FROM ra_ProjectCalendar 
WHERE MonthNumber between @Month and @Month + 12 and FullYear = @Year

今年效果很好,但是今年12月停止了。如何让它显示运行年份?

5 个答案:

答案 0 :(得分:2)

你的日期是如何存储的?

来自你的sql,我猜你有一个月的字段,一个一年一个,一个一天。我建议改为使用一个日期时间字段,然后您可以使用DateAdd()方法添加12个月(或任何其他间隔)。

编辑:在评论中向我指出,你在这方面获得的一件事就是表现 - 这或多或少取决于你的应用程序的规模,但总是很高兴知道。如果您在存储过程中运行此查询,那么您将执行以下操作:

DECLARE @oneYearAhead datetime;
SET @oneYearAhead = DateAdd(m, 12, @PassedDate)

SELECT * FROM ra_ProjectCalendar
 WHERE @PassedDate <= [Date] AND [Date] <= @oneYearAhead; 

使用上面的代码,您将获得所通过日期和提前一年之间的所有条目。 (我不是100%肯定声明和设置@oneYearAhead变量的语法,但你明白了......)。请注意,我在列名称Date周围使用的[]允许我在列名中使用保留字 - 我已经习惯了,而不是记住保留哪些单词...

答案 1 :(得分:1)

试试这个:

SELECT * FROM ra_ProjectCalendar 
WHERE 
  (MonthNumber > @Month AND FullYear = @Year)
  OR (MonthNumber < @Month AND FullYear = @Year + 1)

答案 2 :(得分:0)

这样的事情可能会更好 - 但不清楚你的意图是什么:

select * 
 from ra_ProjectCalendar 
 where DATEDIFF ( month , @startdate , @enddate ) <=12

编辑:这是SQl服务器语法

答案 3 :(得分:0)

实际传入并存储日期而不是月份和年份,并使用DateDiff与当前日期进行比较:

WHERE DATEDIFF(m, @PassedDate, StoredDateColumn) < 12

请注意,我使用了12个月,而不是1年,因为DATEDIFF计算了越过边界的数量。所以在12月,使用带有年份datepart的datediff将在一个月之后返回一个。你真的想要12个月的时间。

答案 4 :(得分:0)

根据您的信息存储方式(从您的查询中有点难以辨别),DATEADD或DATEDIFF可能会对您有所帮助。 MSDN上有可用的date functions列表。