将mm / dd / yyyy h类型的字符串转换为日期时间

时间:2011-09-09 20:52:22

标签: sql sql-server-2008

我有一个将所有字符串转换为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,那就会出错。请告诉我如何处理这个问题?

3 个答案:

答案 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以外的东西提供这个函数的数据,这样你就有了更好的字符串解析器。