我有一个将所有字符串转换为datetime的函数。
ALTER FUNCTION formatit(
@fromtime VARCHAR(50) -- varchar
)
RETURNS DATETIME
AS
BEGIN
DECLARE @from datetime
IF (CHARINDEX('NOON',@fromtime,0)) = 0
SET @from = CONVERT(DATETIME, @fromtime)
ELSE
SET @from =CONVERT(DATETIME, '01/01/2000 12pm')
RETURN(@from)
END
SELECT dbo.formatit('04/12/2011 12 ')
所以,当你看到最后一个选择stmt时,它会抛出错误说:
将char数据类型转换为datetime数据类型 导致日期时间值超出范围。
如果我在下午4点或4点给出时间,它可以正常工作。但如果我只给4,那就会出错。请告诉我如何处理这个问题?
答案 0 :(得分:0)
您致电dbo.formatit('04/12/2011 12 ')
会致电convert(datetime, '04/12/2011 12 ')
。此字符串不是转换为日期/时间值的有效输入。
请参阅CAST and CONVERT reference in MSDN中的格式列表。如果您需要转换此字符串,则需要将时间部分更改为“12:00 PM”或“12:00”(假设为24小时格式)。
答案 1 :(得分:0)
首先,我会在你的表中找到所有独特的时间事件,例如:
select distinct rtrim(substring(@timeField,charindex(' ',@timeField)+1,99))
as TimePortion
这将让您了解您正在处理的事情。
然后,在你的功能中,分开日期和时间部分......
现在,根据您从查询中找到的内容,您需要说明如何处理您找到的时间。例如,如果时间部分是数字,您可以简单地将:00附加到它(即4变为4:00)。如果你看到NOON,你可以用12:00 pm等替换它。
ALTER FUNCTION formatit( @fromtime VARCHAR(50) )
RETURNS DATETIME
AS
BEGIN
declare @dtPortion VARCHAR(12)
declare @tmPortion VARCHAR(32)
declare @x INT
SET @x = charindex(' ',@fromTime)
SET @dtPortion = left(@fromTime,@x-1)
SET @tmPortion = rtrim(substring(@fromTime,@x+1,99))
-- Figure out what to do
SELECT @FromTime =
CASE
WHEN IsNumeric(@tmPortion) = 1 THEN @dtPortion+' '+@tmPortion+':00'
WHEN @tmPortion = 'NOON' THEN @dtPortion+' 12:00pm'
ELSE
@dtPortion+' 12:00pm'
END
SET @from =CONVERT(DATETIME, '01/01/2000 12pm')
RETURN(@from)
END
Go
希望这能让你开始
答案 2 :(得分:0)
你可以添加很多代码来查看字符串,看看是否有':'(就像你有代码寻找NOON一样)。问题是如果字符串在12PM结束,转换也会起作用。所以你必须做类似
的事情ALTER FUNCTION formatit(
@fromtime VARCHAR(50) -- varchar
)
RETURNS DATETIME
AS
BEGIN
DECLARE @from datetime
IF (CHARINDEX('NOON',@fromtime,0)) <> 0
BEGIN
SET @from =CONVERT(DATETIME, '01/01/2000 12pm')
END
ELSE IF (CHARINDEX('PM',@fromtime,0)) = 0 AND (CHARINDEX('AM',@fromtime,0)) = 0 AND (CHARINDEX(':',@fromtime,0)) = 0
BEGIN
SET @fromtime = @fromtime+':00'
SET @from =CAST(@fromtime AS datetime)
END
ELSE
BEGIN
SET @from =CAST(@fromtime AS datetime)
END
return(@from)
END
看起来空白被忽略了 - 我试过这些并且它们都有效......
SELECT dbo.formatit('04/12/2011 12 ')
SELECT dbo.formatit('04/12/2011 12:00')
SELECT dbo.formatit('04/12/2011 12PM')
SELECT dbo.formatit('04/12/2011 12AM')
SELECT dbo.formatit('NOON')
你真的应该看看你用来为TSQL以外的东西提供这个函数的数据,这样你就有了更好的字符串解析器。