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

使用DateSerial函数的SQL自动日期范围,sql,sql-server,date,reporting-services,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查询的筛选器字段中,我可以成功地对MTD数据使用'8/1/2014'和'8/31/2014'之间的,但希望应用Da

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

Between DateSerial(Year(Date()),Month(Date()),1) 
    And DateSerial(Year(Date()),Month(Date())+1,0)
我们需要将上述逻辑转换为SQL/SSRS,以便自动发送电子邮件报告,但我无法将此DateSerial逻辑用于SQL

在SQL查询的筛选器字段中,我可以成功地对MTD数据使用'8/1/2014'和'8/31/2014'之间的
,但希望应用
DateSerial
逻辑,以便不需要为每个月、季度、年度等创建报告


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

您可以使用函数CONVERT:

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

或日期添加:

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
最后一个我从:

见我的网址:


有几种不同的方法来实现这一点。这里只有一条路

  • 今天的约会。在这种情况下
    8/27/2014

    Declare @Today date = cast(getdate() as date)
    
  • 得到一个月的第一天,过去的26天

    Declare @StartDate date = dateadd(d, -1 * (day(@Today) - 1), @Today)
    
  • 选择@Today,@StartDate


  • 这个问题已经解决了。ODBC驱动程序显然不能很好地与SSR配合使用。DateSerial命令在查询本身中不起作用。解决方法是将过滤器添加到数据集。这种语法是有效的,但同样只适用于数据集筛选器:[表达式]在[first value box]=DateSerial(Year(Now()),1,1]之间[second value box]=DateSerial(Year(Now()),12,31)


    这为我们提供了所需的年初至今报告数据。

    这需要是WHERE或HAVING子句。我试过在哪里。。。介于DATEADD(“月”,DATEDIFF(“月”,0,GETDATE())-1,0)和DATEADD(“月”,DATEDIFF(“月”,1,GETDATE())-1,-1)之间。此返回:错误[42703]错误:列“月”不存在。我们使用的是SQL Server 2008,这可能来自ODBC驱动程序吗?错误源:psqlobc。DLL@ITSP你得到了什么结果?请注意,不能在“月份”中使用引号,因为它是一种SQL Server常量。SQL会自动在月份前后添加引号。这返回了:错误[42703]错误:“月”列不存在。@ITSP应该已经工作了。我更新了我的答案,只是为了将其改为当前月份,并指出在SQLServer2008中测试的一个功能示例。您使用的是什么SQL版本?