2011-06-24 93 views
0

我试图获得下面的语句执行。标量值函数期望日期为varchar,而customertable中的原始列为日期时间。我已经完成了我的研究并环顾四周;我试过的各种解决方案都没有奏效。在标量值函数中将datetime转换为varchar SQL Server 2005

当我运行此:

select 
    ID, DATE_COL, 
    dbo.CustRandValuationOnDate (ID, LEFT(CONVERT(VARCHAR, DATE_COL, 120), 10)) 
from customertable 

我得到这个错误:

Conversion failed when converting character string to smalldatetime data type.

UPDATE:功能代码

GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[CustRandValuationOnDate](@DATE VARCHAR(11), @CIFNUMBER VARCHAR(12)) RETURNS FLOAT 
AS BEGIN 
RETURN ISNULL((SELECT SUM(DBO.RandValOfAccOnDate(@DATE, A.ACCOUNTID)) 
     FROM ACCOUNTTBL A, BALANCETBL B 
     WHERE [email protected] 
     AND B.ACCOUNTID=A.ACCOUNTID 
     AND [email protected]), 0.00); 
END 

更新:一些列date_col值都是零。我刚刚证实了这一点。

+0

你的字符串包含什么? –

+0

你的意思是date_column?它包含date_time格式的时间戳,不幸的是它们中的很多都有NULL ... – Mina

回答

0

您正在通过你的params在错误的顺序来运行..

+0

是的,我是。它现在有效。我非常抱歉浪费你的时间。 O_O。 – Mina

0

对于转换到日期,您可以使用Cast(YourVariable As Date)转换为DateFields。

+0

非常感谢您的回答。我刚刚意识到我的问题有些混乱。 DATE是日期列的名称,而不是DATE数据类型。请参阅更新后的帖子。 – Mina

0

看起来您在DATE列中有无效的日期字符串,发生此错误时DATE的值是多少?

+0

值为NULL – Mina

+1

'DATE'列是日期时间数据类型,OP在问题中如此表示。 –

1

OP说DATE是一个日期时间如此:

LEFT(CONVERT(VARCHAR, GETDATE(), 120), 10) 

是有效的和作品,一样:

LEFT(CONVERT(VARCHAR, NULL, 120), 10) 

结果,误差必须在你的dbo.CustRandValuationOnDate()功能。没有这个代码,就没有办法解决这个问题。可能需要编写dbo.CustRandValuationOnDate()来处理NULL输入值。

编辑后功能代码贴:

RETURN ISNULL((SELECT SUM(DBO.RandValOfAccOnDate(@DATE, A.ACCOUNTID)) 
               ^^ID? ^^date?? 

错序参数?

您将函数参数定义为:@DATE VARCHAR(11), @CIFNUMBER VARCHAR(12),但用ID, LEFT(CONVERT(VARCHAR, DATE_COL, 120), 10)来调用它,那么您真正想要做什么?

+0

非常感谢您的回复,KM。现在将发布功能代码。 – Mina

+0

+1 fwiw - OP应该已经将此作为接受的答案,因为这是最终导致您和其他人提出的解决方案的唯一答案。 –

+0

@Lieven,谢谢。是的,我首先发布了关于错误顺序的参数(编辑2:6月24日11:45) –

0

也许你需要重新编写你的标量函数dbo.CustRandValuationOnDate来recive一个日期时间。在这个函数之后,首先验证它是空的。

之后,将其转换为varchar并使用LEFT函数。

0

你应该尝试

选择ID,date_col的,dbo.CustRandValuationOnDate(ID,LEFT(CONVERT(VARCHAR,date_col的,120),10))从CustomerTable的其中ISDATE(date_col的)= 1

+0

'DATE'列是日期时间数据类型,所以'where ISDATE(DATE_COL)= 1'永远是真的,你可以尝试'WHERE DATE IS NOT NULL',但是这会导致不同的结果集,并且可能不是OP希望 –

+0

感谢您的回复,terence。我试过这种方式,我得到这个错误:“转换varchar值'2001-04-01'转换为数据类型int转换失败。” – Mina

相关问题