лучший способ преобразовать и проверить строку даты

Нет вызова метода, если это - то, что Вы просите. С небольшим исследованием я предполагаю, что Вы могли записать свое собственное. Конкретный экземпляр имеет фиксированное, измеренное полученный из количества ссылок и примитивных значений плюс бухгалтерские данные экземпляра. Вы просто обошли бы граф объектов. Чем менее варьировавшийся типы строки, тем легче.

, Если это слишком медленно или просто больше проблемы, чем, он стоит, всегда существует хорошее старомодное правило ползунков подсчета строки.

11
задан Remus Rusanu 18 July 2009 в 18:33
поделиться

2 ответа

Прежде всего, поскольку вы используете SQL Server 2005, вы должны поместить свой код, который может дать сбой, в BEGIN TRY ..... END TRY BEGIN CATCH .... END CATCH блоки - блоки try / catch для T-SQL!

Во-вторых, для всех манипуляций с датой я бы всегда использовал формат ISO-8601 , который будет работать независимо от того, какой текущий формат даты установлен в SQL Server.

Формат ISO-8601: ГГГГММДД только для дат или ГГГГ-ММ-ДДТЧЧ: ММ: СС для даты со временем - поэтому я бы написал ваш код как:

BEGIN TRY
  SET @Source='07152009'
  SET @Temp = RIGHT(@Source, 4) +             -- YYYY
              LEFT(@Source, 2) +              -- MM
              SUBSTRING(@Source, 3, 2)        -- DD

  IF ISDATE(@Temp)!=1
  BEGIN
      RAISERROR('ERROR, invalid date',16,1)
  END

  SET @Destination = CAST(@Temp AS DATETIME)
END TRY
BEGIN CATCH
      -- handle error if something bombs out
END CATCH

Не полагайтесь на какой-либо конкретный установленный формат даты !! Пришлите мне свой код, и я опробую его в швейцарско-немецкой системе - я почти гарантирую, что он сломается, если вы вслепую примете «en-US» и, следовательно, «мм / дд / гггг» - это ' s не одинаковый параметр повсюду на этой планете.

К сожалению, SQL Server довольно плохо обрабатывает даты - возможно, это может быть точкой расширения, в которой использование сборки CLR внутри SQL Server имело бы смысл. гораздо более богатые функции обработки даты в .NET ??

Marc

PS: похоже, формат ISO-8601, который я знал, YYYY-MM-DD, не всегда работает в SQL Server - вопреки тому, что, кажется, проповедует электронная документация . Вместо этого используйте ГГГГММДД или ГГГГ-ММ-ДДТЧЧ: ММ: СС.
t всегда работают в SQL Server - вопреки тому, что, кажется, проповедует электронная документация. Вместо этого используйте ГГГГММДД или ГГГГ-ММ-ДДТЧЧ: ММ: СС.
t всегда работают в SQL Server - вопреки тому, что, кажется, проповедует Электронная документация. Вместо этого используйте ГГГГММДД или ГГГГ-ММ-ДДТЧЧ: ММ: СС.
Спасибо, gbn!

12
ответ дан 3 December 2019 в 06:46
поделиться

Вы можете гарантировать порядок даты, месяца и года, используя SET DATEFORMAT. Это означает, что ISDATE будет анализировать '15-07-2009 'как 15 июля 2009 г.

В противном случае ваш подход достаточно хорош, учитывая внешние ограничения ... но вы также можете изменить порядок в ANSI / ISO.

После ответа marc_s : "SET DATEFORMAT dmy" работает для большинства европейских настроек ...

OK:

SET LANGUAGE british
SELECT ISDATE('2009-07-15') --this is ansi says marc_s. It gives "zero"
SELECT ISDATE('2009-07-15T11:22:33') --this really is ANSI and gives true


SET LANGUAGE german
SELECT ISDATE('2009-07-15') --false
SELECT ISDATE('2009-07-15T11:22:33') --true
6
ответ дан 3 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: