2013-08-25 33 views
0

我有这样一个表中的转换,一个nvarchar数据类型到datetime

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

我想通过我的开始日期与开始时间和结束日期与当天的结束时间,,

+2

你从哪里见过'00.01.00.00'作为公认的时间格式?为什么你将日期作为'NVARCHAR(100)'传递?为什么你的查询在午夜时间(或者从午夜开始不到一分钟)忽略行数 –

+0

sory先生我给出了开始日期+ 00:01:00.000和结束日期+ 23:59:59.000 – user2674855

回答

2

如果你想一次添加到您的日期时间值,只需使用DATEADD

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

你可以找到这个here的文档。

+0

我想只用startdate和enddate – user2674855

+0

啊,我刚才看到你的'@startdate'和'@ enddate'是nvarchar。如果没有通过datetime变量进行交谈,这将无法正常工作。尽管我只是在过程开始时将'@ startdate'和'@enddate'的数据类型更改为'datetime'。 –

+0

是的,先生,这是工作得很好..感谢很多 – user2674855

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' 
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 

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

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

使用格式()帮助解决我..我不知道哪个是标准(可能是112),但它的工作原理。

相关问题