代码之家  ›  专栏  ›  技术社区  ›  Scott and the Dev Team

如何为日历报表创建一个连续的一年?

  •  0
  • Scott and the Dev Team  · 技术社区  · 16 年前

    下面是我使用的查询:

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

    今年效果很好,但在今年12月停止。我怎样才能让它显示一个跑步年?

    5 回复  |  直到 16 年前
        1
  •  1
  •   cjk    16 年前

    试试这个:

    SELECT * FROM ra_ProjectCalendar 
    WHERE 
      (MonthNumber > @Month AND FullYear = @Year)
      OR (MonthNumber < @Month AND FullYear = @Year + 1)
    
        2
  •  2
  •   Tomas Aschan    16 年前

    你的日期是怎么存储的?

    根据您的SQL,我猜您有一个字段表示月份,一个表示年份,一个表示日期。我建议使用一个日期时间字段,然后您可以使用 DateAdd() 方法添加12个月(或任何其他间隔)。

    编辑:我在一篇评论中指出,你在这方面获得的一点是性能——这或多或少地取决于你的应用程序的规模,但总是很高兴知道。如果在存储过程中运行此查询,则将执行以下操作:

    DECLARE @oneYearAhead datetime;
    SET @oneYearAhead = DateAdd(m, 12, @PassedDate)
    
    SELECT * FROM ra_ProjectCalendar
     WHERE @PassedDate <= [Date] AND [Date] <= @oneYearAhead; 
    

    使用上面的代码,您将获得通过日期和提前一年之间的所有条目。(我对声明和设置 @oneYearAhead 变量,但你得到了这个想法…)。请注意 [] 我在列名日期周围使用的方法允许我在列名中使用保留字-我已经习惯了这一点,而不是记住哪些是保留字…

        3
  •  0
  •   E.J. Brennan    16 年前

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

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

    编辑:这是SQL Server语法

        4
  •  0
  •   Joel Coehoorn    16 年前

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

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

    请注意,我用了12个月,而不是1年,因为datediff计算跨越边界的数量。因此,在12月,将datediff与year datepart结合使用只会在一个月后返回一个。你真的想要12个月的时间跨度。

        5
  •  0
  •   Harper Shelby damiankolasa    16 年前

    根据信息的存储方式(从查询中很难判断),dateadd或datediff可能对您有帮助。有一份名单 date functions 在MSDN上。