将数据类型nvarchar转换为datetime时出错?
问题描述:
我正在使用sql server 2005,当我打电话给我存储的proc时出现此错误:将数据类型nvarchar转换为datetime时出错?
将数据类型nvarchar转换为datetime时出错。 那么我怎么能通过我的日期时间来运行我的存储过程?
create procedure [dbo].[myProc]
@id as int,
@date as datetime
as
begin
select id , DATEPART(day, @date)
from myTable
where convert(varchar,[date],101) = convert(varchar,@date,101)
and id [email protected]
end
DECLARE @return_value int
EXEC @return_value = [dbo].[myProc]
@id = 1,
@date = N'getdate()'
SELECT 'Return Value' = @return_value
GO
答
您应该使用一个开放式的日期范围,而不是等式的两边转换为区域字符串。现在
ALTER PROCEDURE [dbo].[myProc]
@id INT,
@date DATETIME
AS
BEGIN
SET NOCOUNT ON;
SELECT id, DATEPART(DAY, @date)
FROM dbo.myTable
WHERE id = @id
AND [date] >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, @date))
AND [date] < DATEADD(DAY, 1, DATEDIFF(DAY, 0, @date));
END
GO
,你不能只是通过getdate()
到像一个存储过程调用(语法是无效的),你当然不能将它作为一个字符串传递。所以有几个选项。
(a)中声明变量前面,指定当前的日期/时间的变量,并通过可变地:
DECLARE @d DATETIME;
SET @d = GETDATE();
EXEC [dbo].[myProc] @id = 1, @date = @d;
(B)使参数可选的,并且然后不打扰顺便指出,在PARAM:
ALTER PROCEDURE [dbo].[myProc]
@id INT,
@date DATETIME = NULL
AS
BEGIN
SET NOCOUNT ON;
SET @date = DATEADD(DAY, 0, DATEDIFF(DAY, 0,
COALESCE(@date, GETDATE())));
SELECT id, DATEPART(DAY, @date)
FROM dbo.myTable
WHERE id = @id
AND [date] >= @date
AND [date] < DATEADD(DAY, 1, @date);
END
GO
现在,您的通话可能只是:
EXEC dbo.myProc @id = 1;
而且,你不应该使用'single quotes'
列别名 - 此语法已弃用。改为使用[square brackets]
。
列[日期]的数据类型是什么?是nvarchar? – 2012-03-28 03:44:31