Конференция "Базы" » mssql Безопасно привести тип (строку привести к дате) [D7, MSSQL]
 
  • ВладОшин © (02.07.14 15:18) [0]
    Нужно строку привести к дате.
    Источник - солянка из всевозможных форматов записи.
    Такой вкусности как TRY_CONVERT нет, версией не вышел(v2008).
    соответственно select
    when ISDATE([DateOpen]) = 1 работает только для сша

    если when ISDATE(CONVERT(datetime, [DateOpen], %format%)) = 1, то если не в этом формате( %format%), то исключение

    если писать функцию

     declare @DT datetime;
     
    BEGIN TRY
     set @DT = CONVERT (datetime, @STR, 0); -- если формат 0
    END TRY
    BEGIN CATCH
     set @DT = null;
    END CATCH
    if @DT is not null
      return(@DT);

    BEGIN TRY
     set @DT = CONVERT (datetime, @STR, 100);  -- если формат 100
    END TRY
    BEGIN CATCH
     set @DT = null;
    END CATCH
    if @DT is not null
      return(@DT);

    и т.п., все возможные перечислить.
    то было бы хорошо, но TRY в функции нельзя юзать

    процедуру можно было бы..
    , но это не удобно. Не напишешь select  

    case
    when  dbo.MyTryToDatetime('что-то неведомое') > getdate()  then

    ----
    как быть ?
  • turbouser © (02.07.14 15:31) [1]
    можно так выкрутиться:
    SET DATEFORMAT mdy;
    SELECT ISDATE('15/04/2008'); --Returns 0.
    SET DATEFORMAT dmy;
    SELECT ISDATE('15/04/2008'); --Returns 1.


    и т.п.

    а можно и CLR сборку сделать и там с форматом работать
  • Кщд (02.07.14 18:00) [2]
    >ВладОшин ©   (02.07.14 15:18)
    то есть по барабану, что третье апреля станет четвертым марта?)
  • ВладОшин © (02.07.14 20:10) [3]

    > Кщд   (02.07.14 18:00) [2]

    Думал..
    Можно прикрутить флаг неоднозначности, если несколько форматов подходят
    эх..и спрашивать, что ли, юзера..  Или попробовать интро/экстро полировать по пред/после идущим ..
  • junglecat (04.07.14 10:14) [4]
    > [0] ВладОшин ©   (02.07.14 15:18)

    а у источника никак нельзя узнать регион, к которому относится дата?
  • ВладОшин © (04.07.14 12:24) [5]
    источник далек от it и платит
    и больше знать ничего не хочет :)
    и таки имеет право :)

    шлёт csv, которые собирает неизвестно где и как
    в одном и том же csv дата в одном формате. В другом может быть в другом. Всего было около 5 форматов

    в принципе, процедурой можно определить формат (как формат, который подходит для всех записей), а потом функцией с параметром какой_это_формат легко сделать
  • turbouser © (04.07.14 12:51) [6]

    > ВладОшин ©   (04.07.14 12:24) [5]


    > в принципе, процедурой можно определить формат

    Ну да, пробежаться по всем датам.. Но гарантии что формат верный не будет.
  • Лакримакристи (05.07.14 21:07) [7]
    А незя разбирать формат не на SQL, а в Делфи, а в БД уже в едином правильном формате отправлять?
  • turbouser © (05.07.14 21:31) [8]

    > Лакримакристи   (05.07.14 21:07) [7]

    тоже самое будет. '01/01/2014' и в дельфи и в SQL и даже мозгу не определить где число, а где месяц, если нет дополнительной информации.
  • Лакримакристи (05.07.14 21:40) [9]
    Я имею ввиду в БД не корячится с подфункциями и BEGIN TRY.
    Жёстко на всю базу SET DATEFORMAT ymd; -> и дата в БД либо тока в таком формате, либо NULL.
    А разбирать в Делфи руками при парсинге csv. Не вышло определить - выдавать пользователю мол "блок номер такой-то не был загружен так как у кого-то руки из задницы и он через неё же заполнил поле дата".
    ..можно даже в popup окне..
    ...поверх всех окон...
    ....на весь экран....
    .....и с голой бабой на фоне.....
    Заказчик будет доволен. :3
  • turbouser © (05.07.14 22:02) [10]

    > Лакримакристи   (05.07.14 21:40) [9]


    > Не вышло определить - выдавать пользователю

    ок. данные за период с 01.03.2014 - 10.03.2014. формат mdy. программа определила что все хорошо. а на самом то деле фигня получается.
  • turbouser © (05.07.14 22:03) [11]

    > с 01.03.2014 - 10.03.2014

    за март, т.е :)
  • turbouser © (05.07.14 22:11) [12]

    > Лакримакристи   (05.07.14 21:40) [9]

    Вообще, ты прав,
    > Не вышло определить - выдавать пользователю мол "блок номер
    > такой-то

    если принять за блок файл. Но судя по
    > ВладОшин ©   (04.07.14 12:24) [5]
    >
    > источник далек от it и платит
    > и больше знать ничего не хочет :)
    > и таки имеет право :)

    Задача решения не имеет :)
  • ВладОшин © (06.07.14 13:37) [13]

    > Задача решения не имеет :)

    имеет.
    Загрузим как определилось - никто не докажет, что оно не так на самом деле :)
    Серьезно. Какие заказчик претензии предъявит, если никто (и сам в т.ч.) не скажет, как правильно понимать надо.

    >>  разбирать в Делфи руками
    .. не желательно.. Будет еще один глупый проект1.ехе..
  • turbouser © (06.07.14 13:47) [14]

    > ВладОшин ©   (06.07.14 13:37) [13]
    >
    >


    > Серьезно. Какие заказчик претензии предъявит, если никто
    > (и сам в т.ч.) не скажет, как правильно понимать надо.

    но это будет нечестно. и когда твой заказчик поимеет проблем, как думаешь, с кого он будет спрашивать? хотя бы предупреди о возможных проблемах.
  • ВладОшин © (06.07.14 14:11) [15]
    turbouser ©   (06.07.14 13:47) [14]
    +1
    уже (02.07.14 18:00)
     предупреди л о возможных проблемах.
    заказчик сказал, что так не может быть, что бы весь блок был аля 03.04.

    Ну а если будет - то опа, да.
  • Inovet © (06.07.14 17:13) [16]
    > [15] ВладОшин ©   (06.07.14 14:11)

    У них всегда "не может так быть", на деле оказывается, что может, но "это же редко бывает".
  • turbouser © (06.07.14 18:31) [17]

    > Inovet ©   (06.07.14 17:13) [16]

    Это отдельная тема для разговора :) Весьма обширная :)
  • turbouser © (06.07.14 19:03) [18]

    > ВладОшин ©

    и да, если возможно - то при наличии неопределенности надо юзера об этом оповестить.
  • sniknik © (07.07.14 07:59) [19]
    акцесс так разбирает, из любого. и блин, сколько из-за этого проблем было... лучше бы он так не делал. ошибка из очевидной прямо распознаваемой при чтении данных переводится в логическую хрен отслеживаемую.

    > У них всегда "не может так быть", на деле оказывается, что может, но "это же редко бывает".
    говорят, что четко поставленное тз от такого спасает... ни разу не видел.
 
Конференция "Базы" » mssql Безопасно привести тип (строку привести к дате) [D7, MSSQL]
Есть новые Нет новых   [134427   +34][b:0][p:0.001]