SQL 中将 varchar 值转换为数据类型 int 时转换失败

Conversion failed when converting varchar value to data type int in SQL

我在获取 SQL 中两个时间值之间的差异时遇到了一些困难。我想 select 日期值开始和结束之间相差小于 5 秒的所有值。

我的数据是这样的

Stop
-----------------------    
2017-10-04 16:32:06:000

Start
-----------------------    
2017-10-04 16:32:02:000

上述情况就是其中一种情况。我在 where 子句中的代码只获取数据中小于 5 秒的值:

  datediff(second, cast(stop as int), cast(start as int)) < 5

我也试过 datediff 没有转换为 int,但仍然收到同样的错误:

Conversion failed when converting the varchar vlue '2017-10-04 20:58:46:000' to data type int

而不是使用 datediff() 将秒数添加到开始时间:

where stop < dateadd(second, 5, start)

您应该将 date/times 存储为 date/time 类型,而不是字符串。但是,您至少有一个标准格式,因此您可以根据需要明确类型转换:

where convert(datetime, stop) < dateadd(second, 5, convert(datetime, start))

这实际上更准确,因为 datediff() 计算两个值之间的 "time boundaries",而不是实际秒数。

不过,datediff() 的主要问题是参数不是整数。所以你可以这样做:

datediff(second, start, stop) < 5

但第一种方法更好

这应该可行,您不需要强制转换即可在几秒钟内获得差异...

select datediff (SECOND,start, stop) from test

测试一下...

select 1 
where ((select datediff (SECOND,start, stop) from test) > 5)

datediff() 查询: 测试 table: