0

我有一张这样的桌子,

表名: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 数据类型转换为 datetime 数据类型导致值超出范围。

我正在尝试用开始时间和结束日期来传递我的开始日期和结束时间,

4

4 回答 4

2

如果您想为您的日期时间值添加时间,只需使用DATEADD.

WHERE dtime BETWEEN DATEADD(minute, 1, @startdate) 
    AND DATEADD(hour, 23, DATEADD(minute, 59, DATEADD(second, 59, @enddate)))

您可以在此处找到相关文档。

于 2013-08-25T17:48:11.360 回答
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 

使用适当的类型将解决此问题。

于 2013-08-25T17:57:40.400 回答
1

使用 ISO 日期时间格式:

  1. 声明@ddatetime=getdate()
  2. 声明@DDdatetime
  3. 选择format(@d, 'yyyymmdd hh:mm:ss.fff')
  4. @dd = format(@d, 'yyyymmdd hh:mm:ss.fff')
  5. 选择@dd

使用 format() 有助于解决我的问题。我不知道哪个是标准的(可能是 112),但它可以工作。

于 2013-10-27T05:15:33.867 回答
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'
于 2013-08-25T17:54:45.700 回答