首页 > 解决方案 > SQL - 在 WHERE 子句中使用日期范围的结果集中未显示正确日期

问题描述

没有 where 子句的结果集显示有来自 9 月 30 日的数据,当使用下面的 where 子句时,第 30 个数据没有出现在结果集中(结果集见下图) -我的主要目的是显示来自在上个月的第一天和上个月的最后一天之间- 非常感谢任何帮助:

SQL 查询

DECLARE @date1 datetime
DECLARE @date2 datetime
SET @date1 = getdate()
SET @date2 = getdate()-15 -- reason for less 15 days is because this will only be run within the first 15 days 
                          -- of the current month, it will enable me to get the last day of the previous 
                          -- month even if I run the SQL in the next month.

SELECT
        A.TA_SEQ as 'WO No',
        A.TA_DUE_DATEUTC

FROM 
        F_TASKS A WITH (NOLOCK)
        INNER JOIN FINFILE B WITH (NOLOCK) ON A.TA_FKEY_IN_SEQ = B.IN_SEQ 
        INNER JOIN InstructionSetGroups C WITH (NOLOCK) ON B.InstructionSetGroupId = C.InstructionSetGroupId 

WHERE
        A.TA_TASK_DESC = 'BREAKDOWN' AND
        A.TA_STATUS IN ('ACTIVE', 'ASSIGNED', 'COMPLETE', 'HISTORY') AND
        A.TA_DUE_DATE >= DATEADD(DAY, 1, EOMONTH(@date1, -2)) AND
        A.TA_DUE_DATE <= EOMONTH(@date2) 

ORDER BY 
        A.TA_DUE_DATE desc

结果集

在 where 子句中使用日期范围的结果集:

块引用

结果集没有在 where 子句中使用日期范围 - 正如您所看到的,也有很多来自 30 日的数据没有被捕获

块引用

标签: sqlsql-serverdatetimewhere-clause

解决方案


EOMONTH非常模棱两可,因为它返回该月的最后一天的午夜我在Will you use EOMONTH()中谈到了为什么我不喜欢这个函数?

如果您想要整个上个月,有比假设代码将在前 15 天内运行更简单、更安全的方法:

DECLARE @ThisMonth date = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);

SELECT ... FROM ...
  WHERE TA_DUE_DATE >= DATEADD(MONTH, -1, @ThisMonth)
    AND TA_DUE_DATE <  @ThisMonth;

我在Simplify Date Period Calculations in SQL Server中解释了为什么DATEFROMPARTS最适合这种工作。

剩下的,我们从哪里开始?


推荐阅读