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