конвертировать строки типа мм / дд / гггг ч в дату и время - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть функция, которая конвертирует все строки в 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:00. Но это дает ошибку, если я даю только 4. Пожалуйста, дайте мне знать, как я могу справиться с этим?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2011

Во-первых, я бы нашел все уникальные события времени в вашей таблице, что-то вроде:

select distinct rtrim(substring(@timeField,charindex(' ',@timeField)+1,99)) 
  as TimePortion

Это даст вам ощущение того, с чем вы имеете дело.

Затем в вашей функции разбейте части даты и времени ...

Теперь, основываясь на том, что вы нашли в запросе, вам нужно указать, что делать с временем, которое вы найдете. Например, если часть времени является числовой, вы можете просто добавить к ней: 00 (т.е. 4 становится 4:00). Если вы видите полдень, вы можете заменить его на 12:00 и т. Д.

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

Надеюсь, это поможет вам начать

0 голосов
/ 10 сентября 2011

Вы можете добавить много кода, чтобы посмотреть на строку и посмотреть, есть ли «:» (например, у вас есть код для поиска NOON).Проблема в том, что если строка заканчивается в 12 вечера, преобразование будет работать тоже.Так что вам придется сделать что-то вроде

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, поэтому у вас есть лучший анализатор строк.

0 голосов
/ 10 сентября 2011

Ваш звонок на dbo.formatit('04/12/2011 12 ') приводит к звонку на convert(datetime, '04/12/2011 12 ').Эта строка не является допустимым вводом для преобразования в значение даты / времени.

См. Список форматов в справочнике CAST и CONVERT в MSDN .Если вам нужно преобразовать эту строку, вам нужно будет изменить временную часть на «12:00 PM» или просто на «12:00» (что предполагается в 24-часовом формате).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...