Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于获取记录的条件WHERE子句_Sql_Sql Server_Sql Server 2008_Sql Server 2005_Sql Server 2008 R2 - Fatal编程技术网

Sql 用于获取记录的条件WHERE子句

Sql 用于获取记录的条件WHERE子句,sql,sql-server,sql-server-2008,sql-server-2005,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2005,Sql Server 2008 R2,我正在使用SQLServer2008R2 我有一个SQL块,如下所示: DECLARE @Day INT = 5 DECLARE @Month INT = NULL DECLARE @year INT = NULL DECLARE @dtnow DATETIME SET @dtnow = GETDATE() IF @Month IS NULL SELECT @Month = MONTH(DATEADD(MONTH,-1, @dtnow )) IF @Year IS NULL

我正在使用SQLServer2008R2

我有一个SQL块,如下所示:

DECLARE @Day INT = 5
DECLARE @Month INT = NULL
DECLARE @year INT = NULL
DECLARE @dtnow DATETIME

SET @dtnow = GETDATE()

IF @Month IS NULL
    SELECT @Month = MONTH(DATEADD(MONTH,-1, @dtnow ))

IF @Year IS NULL
    SELECT @year = YEAR(DATEADD(MONTH,-1, @dtnow ))


SELECT * 
FROM TblSalesRecords 
WHERE 
    CASE WHEN @Day IS NULL THEN -- Condition One
        BEGIN 
            ISNULL(@Month, MONTH(TblSalesRecords.CreatedDate)) = MONTH(TblSalesRecords.CreatedDate) 
            AND (@year, YEAR(TblSalesRecords.CreatedDate)) = YEAR(TblSalesRecords.CreatedDate)
        END 
    ELSE                        -- Condition two
        BEGIN 
            TblSalesRecords.CreatedDate BETWEEN CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(DATEADD(MONTH,-1, @dtnow ))) + '-' + CONVERT(VARCHAR,month(DATEADD(MONTH,-1,@dtnow))) + '-' + CONVERT(VARCHAR, DAY(DATEADD(MONTH,-1,@dtnow))) +' 00:00:00.000') 
            AND CONVERT (DATETIME, CONVERT(VARCHAR,YEAR(DATEADD(DAY,-1,@dtnow ))) + '-' + CONVERT(VARCHAR,MONTH(DATEADD(DAY,-1,@dtnow))) + '-' + CONVERT(VARCHAR, DAY(DATEADD(DAY,-1,@dtnow))) +' 23:59:59.998')
        END
    END 
    AND TblSalesRecords.IsDeleted=0
我想要达到的是

如果@Day设置为NULL,那么它应该执行CASE..WHEN语句的-Condition-One或-Condition-two

但我在=in CASE..WHEN语句附近得到语法错误


有人能告诉我如何实现这一点吗?

您可以通过以下方式实现:

SELECT * 
FROM TblSalesRecords 
WHERE (@Day IS NULL 
            AND ISNULL(@Month, MONTH(TblSalesRecords.CreatedDate)) = MONTH(TblSalesRecords.CreatedDate) 
            AND (@year, YEAR(TblSalesRecords.CreatedDate)) = YEAR(TblSalesRecords.CreatedDate)
       )
    OR (@Day IS NOT NULL                      -- Condition two
            AND TblSalesRecords.CreatedDate BETWEEN CONVERT(DATETIME, CONVERT(VARCHAR,YEAR(DATEADD(MONTH,-1, @dtnow ))) + '-' + CONVERT(VARCHAR,month(DATEADD(MONTH,-1,@dtnow))) + '-' + CONVERT(VARCHAR, DAY(DATEADD(MONTH,-1,@dtnow))) +' 00:00:00.000') 
            AND CONVERT (DATETIME, CONVERT(VARCHAR,YEAR(DATEADD(DAY,-1,@dtnow ))) + '-' + CONVERT(VARCHAR,MONTH(DATEADD(DAY,-1,@dtnow))) + '-' + CONVERT(VARCHAR, DAY(DATEADD(DAY,-1,@dtnow))) +' 23:59:59.998')
        )
    AND TblSalesRecords.IsDeleted=0

@year,YEARTblSalesRecords.CreatedDate=YEARTblSalesRecords.CreatedDate中还有另一个语法错误,但我不确定应该有什么,所以我保留了原样。

谢谢Syzmon。让我检查一下,不行。在本例中,条件1和条件2都在获取记录。在本例中@Day是否为null?在没有看到数据的情况下很难给你一个明确的答案。Day设置为null。声明@Day INT=NULL。确切的情况是,当我将Day设置为NULL时,我将获取上个月的所有记录。这就是为什么我设置SELECT Month=MONTHDATEADDMONTH,-1,dtnow,其中dtnow是当前日期。如果Day不为null,那么我希望获取从上个月的Day开始的记录,从我过去的Day到比本月的Day少一天的记录。