sql - 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 日的数据没有被捕获
解决方案
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
最适合这种工作。
剩下的,我们从哪里开始?
getdate()-15
是惰性的、不直观的速记,在其他情况下会中断。请使用DATEADD(DAY, -15, GETDATE())
并查看要踢的坏习惯:使用日期/时间操作的速记。您可以以比每个声明的显式行更易读的方式声明/设置,并再次为每个集合:
DECLARE @date1 datetime = GETDATE(), @date2 datetime = DATEADD(DAY, -15, GETDATE());
as 'WO No'
- 请使用AS [Wo No]
或AS "Wo No"
- 字符串定界符使这些别名看起来像字符串,并且该语法的某些形式已被弃用。>= AND <=
是一样的BETWEEN
。我BETWEEN
在《BETWEEN 和魔鬼有什么共同点?我正在使用 NOLOCK 有
NOLOCK
很多资源;那不好吗?负责任约会中的一般约会技巧
推荐阅读
- javascript - Rails 使用方法从一个 js 文件到另一个 js 文件
- sql - sp_msforeachtable 不可用:获取表名 + min(value) + max(value)
- python - 将列表的数据与其最后一个值配对
- javascript - 将依赖注入 Vuex 模块
- flutter - 如何使用 charts_flutter 包在 Flutter 中显示工具提示
- redhat - 如何在 Redhat 的 3scale 中将门户工件从一个环境移动到另一个环境
- node.js - 如何保存数组?
- javascript - 为什么我必须在反应上下文对象中创建空函数?
- javascript - 单击浏览器后退按钮时网页中的 Jquery 元素未加载到网页上
- jenkins - 从 jenkins 中的 sh 文件设置环境,并在构建的其余部分保留它