T-SQL:如何在当月第一天之前获取所有记录?

时间:2018-04-20 17:50:57

标签: sql tsql ssrs-2012

使用SQL Server:我试图在当前月份的第一天之前找到所有记录,并将其设置为SSRS报告中的参数(因此我不能使用静态值)。

因此,我需要在每个当月的第一天之前的所有记录中继续!undefined would be true列(' yyyy-mm-dd')。

我已经看到了很多关于如何查找特定月份和其他各种搜索记录的线索,但没有与上述内容具体相关。有兴趣了解CREATEDDATETIME功能是否有用。

感谢您的帮助和建议。

4 个答案:

答案 0 :(得分:2)

这是一个使用EOMONTH() function和可选参数-1的表达式。

说明:

  

DateAdd:在表达式中添加1天

     

getdate是当前日期

     

EOMONTH是特定月份的结束日;但是,如果你输入一个可选的整数-1,这将意味着上个月

     

因此:当月的第一天是上个月结束的一天

SELECT DATEADD(DAY,1,EOMONTH(getdate(),-1));

Result: 2018-04-01

在你的查询中如此:

select * 
from table 
where CREATEDDATETIME < DATEADD(DAY,1,EOMONTH(getdate(),-1));

答案 1 :(得分:0)

我会使用datefromparts()

select t.*
from t
where CREATEDDATETIME < datefromparts(year(getdate()), month(getdate()), 1);

答案 2 :(得分:0)

已经有两个其他答案可行了,但为了完整起见,这是第三种常用技术:

SELECT *
FROM [table] 
WHERE CREATEDDATETIME < dateadd(month, datediff(month,0, current_timestamp), 0)

您可能还会得到建议您使用字符串构建日期的答案。不要那样做。它是您可以使用的效率最低且最容易出错的选项。

答案 3 :(得分:0)

这三个答案都很不错,无论如何您都会发现它将选择当月第一天之前的所有数据,直到Createdate的第一天为止。这可能会导致报表永久运行,也许是为了限制代码,而我将使用类似的方式来生成仅提供上个月详细信息的报表。

Select [columns] 
from [source]
where [Createdate] between
/*First day of last Month*/
DATEADD(mm, DATEDIFF(mm, 0, Getdate())-1, 0 and
/*First day of this Month*/
dateadd(mm,datediff(mm,0,Getdate()),0)