我有一张这样的表,
表名:transaction_tbl
我有一个这样的存储过程:
ALTER PROCEDURE [dbo].[Test] @startdate NVARCHAR(100),
@enddate NVARCHAR(100)
AS
BEGIN
SELECT t.PlateNo
FROM Transaction_tbl t
WHERE dtime BETWEEN @startdate + ' 00.01.00.00' AND @enddate + ' 23:59.59.00'
END
执行此操作时我收到此错误
将nvarchar数据类型转换为日期时间数据类型 导致超出范围的价值。
我正在尝试将开始日期与开始时间和结束日期一起传递给当天的结束时间,
答案 0 :(得分:2)
如果您想为日期时间值添加时间,请使用DATEADD
。
WHERE dtime BETWEEN DATEADD(minute, 1, @startdate)
AND DATEADD(hour, 23, DATEADD(minute, 59, DATEADD(second, 59, @enddate)))
您可以找到此here的文档。
答案 1 :(得分:1)
如果您打算有日期,为什么要传递nvarchar()
参数?为什么不这样做:
ALTER PROCEDURE [dbo].[Test] @startdate DATE,
@enddate DATE
AS
BEGIN
SELECT t.PlateNo
FROM Transaction_tbl t
WHERE dtime BETWEEN dateadd(ss, 1, cast(@startdate as datetime)) and
dateadd(ss, 24*60*60 - 1, cast(@enddate as datetime));
END
使用适当的类型将解决此问题。
答案 2 :(得分:1)
使用ISO日期时间格式:
@d
声明为datetime
= getdate()
@DD
声明为datetime
format(@d, 'yyyymmdd hh:mm:ss.fff')
@dd = format(@d, 'yyyymmdd hh:mm:ss.fff')
@dd
使用format()有助于解决我的问题..我不知道哪个是标准的(可能是112个)但是它有效。
答案 3 :(得分:0)
创建DATETIME变量,然后使用它们。
SET date1 = CONVERT(datetime, @startdate + ' 00:01:00', 120)
//same way, declare date2
SELECT t.PlateNo
FROM Transaction_tbl t
WHERE dtime BETWEEN @date1 + ' 00.01.00.00' AND @date2 + ' 23:59.59.00'