在 Where 子句中使用日期时间变量

Ras*_*man 2 sql-server t-sql sql-server-2008-r2

我正在尝试将销售日期 >= 的所有数据提取到某个日期时间。当我执行查询时,出现以下错误:

消息 241,级别 16,状态 1,第 15 行
从字符串转换日期和/或时间时转换失败。

我应该改变什么才能让他的查询运行?下面是示例 DDL

Declare @datetime datetime = GetDate(), @sql varchar(max)

Create Table #dinonuggets
(
  saledate datetime
  ,item varchar(500)
)

Insert Into #dinonuggets Values
('2016-03-30 12:02:00.000','chair')
,('2016-03-04 08:12:48.000','stove')
,('2016-03-07 09:37:39.000','washer')


Set @sql = 'Select * FROM #dinonuggets WHERE saledate >= '+@datetime+' '
Print @sql
Exec (@sql)
Run Code Online (Sandbox Code Playgroud)

我的预期输出将是
03/30/2016 12:02:00.000 椅子,
因为这是唯一符合标准的数据

AMt*_*two 11

您的问题与您构建动态 SQL 的方式有关。如果您查看 PRINT 语句的输出,您的@datetime. 此外,从动态 SQL 中的 #temp 表中选择不会做你想要它做的事情。#dynonuggets将超出您的动态 SQL 的范围。如果您确实需要使用动态表,则需要创建一个名为的全局临时表##dynonuggets

我假设,DynoNuggets是一个真正的表,你必须使用动态 SQL,你的例子只是针对你的问题进行了简化。

您可以添加引号,但更合适的解决方案是使用 sp_executesql 来参数化您的动态 SQL

尝试这个:

DECLARE @datetime datetime = GETDATE(), 
        @sql nvarchar(max),
        @params nvarchar(1000)

CREATE TABLE DinoNuggets
(
  saledate datetime
  ,item varchar(500)
)

INSERT INTO DinoNuggets VALUES
('2016-03-30 12:02:00.000','chair')
,('2016-03-04 08:12:48.000','stove')
,('2016-03-07 09:37:39.000','washer')

SET @sql = N'SELECT * FROM DinoNuggets WHERE saledate >= @ParamValue';
SET @Params = N'@ParamValue datetime';
PRINT @sql;
EXEC sp_executesql @sql, @params, @ParamValue = @datetime
Run Code Online (Sandbox Code Playgroud)