sql - SSRS 从去年 1 月提取数据
问题描述
基本上,当报告运行时,我想显示 YTD 数据;除非,现在是一月份,那么,我想显示去年的所有内容。
我一直试图将它放在我的 where 语句中,使用 case 或 iif。在这两种情况下,我都会收到相同的错误:Msg 102,Level 15,State 1...'between' 附近的语法不正确。
SELECT
name,
owner,
duedate,
submitteddate
FROM Table
WHERE submitteddate IS NOT NULL AND
CASE WHEN MONTH(GETDATE()) = 1
THEN submitteddate between DATEADD(YEAR, DATEDIFF(YEAR, '19000101', GETDATE()) - 1 , '19000101') AND DATEADD(d, -1, DATEADD(YEAR, DATEDIFF(YEAR, '19000101', GETDATE()), '19000101'))))
ELSE submitteddate between DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AND GETDATE()))
end
解决方案
与其在 中使用不是 SARGable的CASE
表达式,不如使用变量更好:WHERE
DECLARE @StartDate DATE, @EndDate Date;
SET @StartDate = CASE DATEPART(MONTH,GETDATE()) WHEN 1 THEN DATEADD(YEAR, DATEDIFF(YEAR, 0,GETDATE())-1,0)
ELSE DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()),0)
END;
SET @EndDate = DATEADD(YEAR,DATEDIFF(YEAR, 0,@StartDate)+1,0);
--SELECT @StartDate, @EndDate; --Uncomment to check the values, but would break SSRS, as it only reads the first returned dataset.
SELECT [name],
[owner],
duedate,
submitteddate
FROM [Table]
WHERE submitteddate >= @StartDate
AND submitteddate < @EndDate;
请注意,无需检查 的值是否submitteddate
为NULL
。NULL = {expression}
将始终导致“未知”,这是不正确的,因此不会在数据集中返回。因此,如果您不想要NULL
值,那么该IS NOT NULL
子句在类似的情况下是没有意义的WHERE
:
WHERE [Column] IS NOT NULL
AND [Column] = 1;
以上将返回与以下完全相同的行:
WHERE [Column] = 1;
推荐阅读
- hibernate - 使用复合键的单个字段的 JPA 连接
- javascript - 根据反应中另一个下拉列表的值创建动态下拉列表行
- java - JavaFX 错误:当我尝试运行我的 jar 文件时,无法使用 gradle (IntelliJ) 找到或加载主类 home.main
- java - Spring Boot 不使用 @JsonbTypeAdapter
- python-3.x - 带有熊猫的列中的行内换行
- node.js - Keycloak 可以保护端口 3000 免受侦听 3003 的应用程序的影响吗?
- api - 数据库中未找到数据时的 Http 状态码
- python - 通过 Scapy 向数据包添加新协议,但我没有在控制器或 Wireshark 上看到该字段
- c - 有没有办法在 scanf() 函数中强制输入空间?
- java - 如何将 FontAwesomeIcon 添加到 Java 文件