查询日期是否在上个月内的表达式?

时间:2019-02-18 00:57:48

标签: tsql

我正在努力思考获取上个月内创建的所有行/记录的最简单方法。我可以在下面构建某种复杂的模型,但是有没有更简单的方法?

SELECT
    * 
FROM
    MyTable
WHERE
    MONTH( createdAt ) >= MONTH( GET_DATE() ) - 1
    AND
    YEAR( createdAt ) = YEAR( GET_DATE );

以上方法适用,但不适用于12月的记录。有什么建议可以简化操作并处理12月创建的记录吗?

2 个答案:

答案 0 :(得分:0)

DECLARE @startOfMonth date = DATEFROMPARTS( YEAR( SYSUTCDATETIME() ), MONTH( SYSUTCDATETIME() ), 1 )

SELECT
    *
FROM
    myTable
WHERE
    createdAt >= @startOfMonth

或内联它(SQL Server应该检测到RHS是常量,因此使用变量不会提高性能):

SELECT
    *
FROM
    myTable
WHERE
    createdAt >= DATEFROMPARTS( YEAR( SYSUTCDATETIME() ), MONTH( SYSUTCDATETIME() ), 1 )

答案 1 :(得分:0)

如果您正在寻找上个月内的记录,我假设您的意思是最近30天将有效:

SELECT * 
FROM myTable
where createdAt >= CAST(DATEADD(day,-30,GETDATE()) as date)

如果您实际上正在查找上个月的记录,那么它将起作用:

SELECT *
from myTable
WHERE createdAt >= CAST( DATEADD(month, DATEDIFF(month, -1, GETDATE()) - 2, 0) as date)