-
Нужно строку привести к дате.
Источник - солянка из всевозможных форматов записи.
Такой вкусности как 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
----
как быть ?
-
можно так выкрутиться:
SET DATEFORMAT mdy;
SELECT ISDATE('15/04/2008'); --Returns 0.
SET DATEFORMAT dmy;
SELECT ISDATE('15/04/2008'); --Returns 1.
и т.п.
а можно и CLR сборку сделать и там с форматом работать
-
>ВладОшин © (02.07.14 15:18)
то есть по барабану, что третье апреля станет четвертым марта?)
-
> Кщд (02.07.14 18:00) [2]
Думал..
Можно прикрутить флаг неоднозначности, если несколько форматов подходят
эх..и спрашивать, что ли, юзера.. Или попробовать интро/экстро полировать по пред/после идущим ..
-
> [0] ВладОшин © (02.07.14 15:18)
а у источника никак нельзя узнать регион, к которому относится дата?
-
источник далек от it и платит
и больше знать ничего не хочет :)
и таки имеет право :)
шлёт csv, которые собирает неизвестно где и как
в одном и том же csv дата в одном формате. В другом может быть в другом. Всего было около 5 форматов
в принципе, процедурой можно определить формат (как формат, который подходит для всех записей), а потом функцией с параметром какой_это_формат легко сделать
-
> ВладОшин © (04.07.14 12:24) [5]
> в принципе, процедурой можно определить формат
Ну да, пробежаться по всем датам.. Но гарантии что формат верный не будет.
-
А незя разбирать формат не на SQL, а в Делфи, а в БД уже в едином правильном формате отправлять?
-
> Лакримакристи (05.07.14 21:07) [7]
тоже самое будет. '01/01/2014' и в дельфи и в SQL и даже мозгу не определить где число, а где месяц, если нет дополнительной информации.
-
Я имею ввиду в БД не корячится с подфункциями и BEGIN TRY.
Жёстко на всю базу SET DATEFORMAT ymd; -> и дата в БД либо тока в таком формате, либо NULL.
А разбирать в Делфи руками при парсинге csv. Не вышло определить - выдавать пользователю мол "блок номер такой-то не был загружен так как у кого-то руки из задницы и он через неё же заполнил поле дата".
..можно даже в popup окне..
...поверх всех окон...
....на весь экран....
.....и с голой бабой на фоне.....
Заказчик будет доволен. :3
-
> Лакримакристи (05.07.14 21:40) [9]
> Не вышло определить - выдавать пользователю
ок. данные за период с 01.03.2014 - 10.03.2014. формат mdy. программа определила что все хорошо. а на самом то деле фигня получается.
-
> с 01.03.2014 - 10.03.2014
за март, т.е :)
-
> Лакримакристи (05.07.14 21:40) [9]
Вообще, ты прав,
> Не вышло определить - выдавать пользователю мол "блок номер
> такой-то
если принять за блок файл. Но судя по
> ВладОшин © (04.07.14 12:24) [5]
>
> источник далек от it и платит
> и больше знать ничего не хочет :)
> и таки имеет право :)
Задача решения не имеет :)
-
> Задача решения не имеет :)
имеет.
Загрузим как определилось - никто не докажет, что оно не так на самом деле :)
Серьезно. Какие заказчик претензии предъявит, если никто (и сам в т.ч.) не скажет, как правильно понимать надо.
>> разбирать в Делфи руками
.. не желательно.. Будет еще один глупый проект1.ехе..
-
> ВладОшин © (06.07.14 13:37) [13]
>
>
> Серьезно. Какие заказчик претензии предъявит, если никто
> (и сам в т.ч.) не скажет, как правильно понимать надо.
но это будет нечестно. и когда твой заказчик поимеет проблем, как думаешь, с кого он будет спрашивать? хотя бы предупреди о возможных проблемах.
-
turbouser © (06.07.14 13:47) [14]
+1
уже (02.07.14 18:00)
предупреди л о возможных проблемах.
заказчик сказал, что так не может быть, что бы весь блок был аля 03.04.
Ну а если будет - то опа, да.
-
> [15] ВладОшин © (06.07.14 14:11)
У них всегда "не может так быть", на деле оказывается, что может, но "это же редко бывает".
-
> Inovet © (06.07.14 17:13) [16]
Это отдельная тема для разговора :) Весьма обширная :)
-
> ВладОшин ©
и да, если возможно - то при наличии неопределенности надо юзера об этом оповестить.
-
акцесс так разбирает, из любого. и блин, сколько из-за этого проблем было... лучше бы он так не делал. ошибка из очевидной прямо распознаваемой при чтении данных переводится в логическую хрен отслеживаемую.
> У них всегда "не может так быть", на деле оказывается, что может, но "это же редко бывает".
говорят, что четко поставленное тз от такого спасает... ни разу не видел.