SQL自动日期范围使用DateSerial函数

时间:2014-08-27 19:41:40

标签: sql sql-server date reporting-services

我们一直在使用MS Access,其MTD数据的语法如下:

Between DateSerial(Year(Date()),Month(Date()),1) 
    And DateSerial(Year(Date()),Month(Date())+1,0)

我们需要将上述逻辑转换为自动电子邮件报告的SQL / SSRS,但我无法使用此DateSerial逻辑来使用SQL。

在SQL查询的Filter字段中,我可以成功地将BETWEEN '8/1/2014' AND '8/31/2014'用于MTD数据,但是希望应用DateSerial逻辑,这样就不需要为每个人创建报告月,季度,年等等。

尝试使用DateSerial函数时,我们会收到错误“无效或缺少表达式”。我已经看到了一些关于这方面需要参数的主题,但我确实认为这是过滤器字段的一个简单语法问题,因为实际日期与BETWEEN命令一起使用。

3 个答案:

答案 0 :(得分:0)

您可以使用CONVERT函数:

http://msdn.microsoft.com/en-us/library/ms187928.aspx

如果您使用的是SQL Server 2012,则为DATEFROMPARTS函数:

http://msdn.microsoft.com/en-us/library/hh213228.aspx

或DATEADD:

select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0); -- first day of current month
select DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE()), -1) -- last day of current month

我最后一次拍摄:https://stackoverflow.com/a/11746042/1274092

见我的:

http://sqlfiddle.com/#!3/d41d8/38333

答案 1 :(得分:0)

有几种不同的方法可以解决这个问题。这只是一种方式。

  1. 获取今天的约会。在这种情况下8/27/2014

    Declare @Today date = cast(getdate() as date)
    
  2. 获取本月的第一天,过去26天

    Declare @StartDate date = dateadd(d, -1 * (day(@Today) - 1), @Today)
    
  3. select @Today, @StartDate

答案 2 :(得分:0)

这已经解决了。 ODBC驱动程序显然不能很好地与SSRS配合使用。 DateSerial命令在查询本身中不起作用。解决方法是将过滤器添加到数据集。此语法有效,但仅在数据集过滤器中:[expression]在[first value box] = DateSerial(Year(Now()),1,1)之间[第二个值框] = DateSerial(Year(Now()) ),12,31)

这为我们提供了我们所需的YTD报告数据。