TSQL-查看日期是否介于日期之间

TSQL-查看日期是否介于日期之间,sql,tsql,datetime,Sql,Tsql,Datetime,我有以下动态SQL查询,用于筛选数据范围的结果。如果我的“createdFrom”和“createdTo”日期不为空,我会在select语句中添加where子句 我有两个问题: 你打算怎么做?我的逻辑正确吗 当我添加以下代码时,当前收到一条错误消息,为什么会收到此消息 将字符串转换为smalldatetime时转换失败 数据类型 Declare@createdFromDate SMALLDATETIME=NULL, @createdToDate SMALLDATETIME=NULL 如果@cr

我有以下动态SQL查询,用于筛选数据范围的结果。如果我的“
createdFrom
”和“
createdTo
”日期不为空,我会在select语句中添加where子句

我有两个问题:

  • 你打算怎么做?我的逻辑正确吗

  • 当我添加以下代码时,当前收到一条错误消息,为什么会收到此消息

    将字符串转换为smalldatetime时转换失败 数据类型

  • Declare@createdFromDate SMALLDATETIME=NULL,
    @createdToDate SMALLDATETIME=NULL
    如果@createdFromDate不为空
    开始
    选择@sWhere=@sWhere+'和g.CreatedOn>'+@createdFromDate
    结束
    如果@createdToDate不为NULL
    开始
    为您的问题选择@sWhere=@sWhere+”和g.CreatedOn

    当我添加以下代码时,我当前收到一条错误消息,为什么会收到此消息

    出现此错误的原因是当执行查询时,您的条件变为

    AND g.CreatedOn > 2015-05-07
    
    这是无效的,但是你的需要

    AND g.CreatedOn > '2015-05-07'
    
    因此,您的SQL应该是

    SELECT @sWhere = @sWhere + 'AND g.CreatedOn > '''+@createdFromDate + ''''
    
    谢谢你的提问

    你打算怎么做?我的逻辑正确吗

    您应该像这样在动态SQL中使用和传递变量

    IF @createdFromDate IS NOT NULL 
       BEGIN
          SELECT @sWhere = @sWhere + 'AND g.CreatedOn > @createdFromDate'
       END
    
    IF @createdToDate IS NOT NULL
       BEGIN
          SELECT @sWhere = @sWhere + ' AND g.CreatedOn < @createdToDate'
       END
    
    你会用

    EXEC sp_executeSQL @SQL,N'@createdFromDate smalldatetime,@createdToDate smalldatetime',@createdFromDate,@createdToDate
    
    其中
    @SQL
    是从您的
    @Where

    注意:如果这是使用动态SQL的唯一原因,那么您不需要动态SQL。

    关于您的问题

    当我添加以下代码时,我当前收到一条错误消息,为什么会收到此消息

    出现此错误的原因是当执行查询时,您的条件变为

    AND g.CreatedOn > 2015-05-07
    
    这是无效的,但是你的需要

    AND g.CreatedOn > '2015-05-07'
    
    因此,您的SQL应该是

    SELECT @sWhere = @sWhere + 'AND g.CreatedOn > '''+@createdFromDate + ''''
    
    谢谢你的提问

    你打算怎么做?我的逻辑正确吗

    您应该像这样在动态SQL中使用和传递变量

    IF @createdFromDate IS NOT NULL 
       BEGIN
          SELECT @sWhere = @sWhere + 'AND g.CreatedOn > @createdFromDate'
       END
    
    IF @createdToDate IS NOT NULL
       BEGIN
          SELECT @sWhere = @sWhere + ' AND g.CreatedOn < @createdToDate'
       END
    
    你会用

    EXEC sp_executeSQL @SQL,N'@createdFromDate smalldatetime,@createdToDate smalldatetime',@createdFromDate,@createdToDate
    
    其中
    @SQL
    是从您的
    @Where


    注意:如果这是使用动态SQL的唯一原因,您不需要动态SQL。

    您的问题的直接答案是日期常量需要用单引号括起来。与此相反:

    SELECT @sWhere = @sWhere + 'AND g.CreatedOn > '+@createdFromDate
    
    使用:

    您的问题的正确答案是您应该使用
    sp_executesql
    来执行动态SQL。这允许您包括参数,因此您可以说:

    exec sp_executesql @sql,
        N'@createdFromDate date',
        @createdFromDate = @createdFromDate;
    
    其中,
    @sql
    是一个如下所示的字符串:

    select . . .
    . . .
    where . . . and
          g.CreatedOn = @createdFromDate;
    

    您的问题的直接答案是日期常量需要用单引号括起来。与此相反:

    SELECT @sWhere = @sWhere + 'AND g.CreatedOn > '+@createdFromDate
    
    使用:

    您的问题的正确答案是您应该使用
    sp_executesql
    来执行动态SQL。这允许您包括参数,因此您可以说:

    exec sp_executesql @sql,
        N'@createdFromDate date',
        @createdFromDate = @createdFromDate;
    
    其中,
    @sql
    是一个如下所示的字符串:

    select . . .
    . . .
    where . . . and
          g.CreatedOn = @createdFromDate;
    

    导致问题的原因是您试图将
    smalldatetime
    与字符串数据类型(如
    VARCHAR
    )连接在一起。您可以将日期转换为
    VARCHAR
    ,以避开此问题<代码>CONCAT()
    会更好。在连接不同数据类型的值时,它是您最好的朋友。我强烈推荐使用它,遗憾的是,它只受SQL Server 2012+及以上版本的支持,甚至没有多少人知道它的存在

    现在,对于特定的问题,我不认为动态SQL是必要的。您通常应该避免使用动态SQL,因为它很难在以后进行调试和更改。像这样的东西对你很合适

    Declare @createdFromDate SMALLDATETIME = NULL,
            @createdToDate SMALLDATETIME = NULL 
    
    SELECT *
    FROM yourTable
    WHERE   (
                date_column > @createdFromDate
                OR @createdFromDate IS NULL
            )
            AND
            (
                date_column < @createdToDate
                OR @createdToDate IS NULL
            )
    
    Declare@createdFromDate SMALLDATETIME=NULL,
    @createdToDate SMALLDATETIME=NULL
    挑选*
    从你的桌子上
    在哪里(
    日期列>@createdFromDate
    或者@createdFromDate为空
    )
    及
    (
    日期列<@createdToDate
    或者@createdToDate为空
    )
    
    导致问题的原因是您试图将
    smalldatetime
    与字符串数据类型(如
    VARCHAR
    )连接在一起。您可以将日期转换为
    VARCHAR
    ,以避开此问题<代码>CONCAT()会更好。在连接不同数据类型的值时,它是您最好的朋友。我强烈推荐使用它,遗憾的是,它只受SQL Server 2012+及以上版本的支持,甚至没有多少人知道它的存在

    现在,对于特定的问题,我不认为动态SQL是必要的。您通常应该避免使用动态SQL,因为它很难在以后进行调试和更改。像这样的东西对你很合适

    Declare @createdFromDate SMALLDATETIME = NULL,
            @createdToDate SMALLDATETIME = NULL 
    
    SELECT *
    FROM yourTable
    WHERE   (
                date_column > @createdFromDate
                OR @createdFromDate IS NULL
            )
            AND
            (
                date_column < @createdToDate
                OR @createdToDate IS NULL
            )
    
    Declare@createdFromDate SMALLDATETIME=NULL,
    @createdToDate SMALLDATETIME=NULL
    挑选*
    从你的桌子上
    在哪里(
    日期列>@createdFromDate
    或者@createdFromDate为空
    )
    及
    (
    日期列<@createdToDate
    或者@createdToDate为空
    )
    
    您使用的是哪个版本的SQL Server?应避免使用动态SQL,因为动态SQL容易受到SQL注入攻击。在不可能的情况下,在将smallDateTime数据连接到@sWhere之前,请尝试将其转换为char数据。什么数据类型是
    g.CreatedOn
    ?您使用的是什么版本的SQL Server?应避免使用动态SQL,因为动态SQL易受SQL注入攻击。在不可能的情况下,请尝试将smallDateTime转换为字符数据,然后再将它们连接到@sWhere。什么数据类型是
    g.CreatedOn