将nvarchar数据类型转换为日期时间

时间:2013-08-25 17:43:50

标签: sql-server

我有一张这样的表,

表名:transaction_tbl

enter image description here

我有一个这样的存储过程:

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数据类型转换为日期时间数据类型   导致超出范围的价值。

我正在尝试将开始日期与开始时间和结束日期一起传递给当天的结束时间,

4 个答案:

答案 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日期时间格式:

  1. @d声明为datetime = getdate()
  2. @DD声明为datetime
  3. 选择format(@d, 'yyyymmdd hh:mm:ss.fff')
  4. 设置@dd = format(@d, 'yyyymmdd hh:mm:ss.fff')
  5. 选择@dd
  6. 使用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'