Конвертировать varchar в разные форматы на сегодняшний день - PullRequest
1 голос
/ 07 июля 2011

У меня есть таблица, которая содержит столбец Дата в формате varchar.Формат даты варьируется, так как это формат даты компьютера, который использовал нашу программу.Например, у меня есть следующие форматы:

  1. 10.7.2010
  2. 7/11 / 2010 7:36:55

Имеюпопытался использовать:

SELECT        CONVERT(DateTime, Date, 103) AS Expr1
FROM            MyTable 

Но я получаю исключение даты / времени вне допустимого диапазона для следующей строки:

7/13/2010 3:33:45 PM

Мне нужен способ преобразования этих значений в унифицированный формат,Время и формат вывода не важны, если они сопоставимы (при копировании в Excel или что-то в этом духе. Его следует использовать извне, поэтому я не против не изменять действительные значения в БД).
База данныхMSSQL 2005.

Ответы [ 3 ]

2 голосов
/ 07 июля 2011

Вам необходимо ознакомиться с MSDN Books Online - тема: CAST and CONVERT .

Здесь отображаются все возможные поддерживаемые форматы даты, например,

CONVERT(VARCHAR(50), GETDATE(), 112)

преобразует сегодняшнюю дату в формат ISO, и вы получите 20110707 в качестве вывода.

Для максимальной совместимости я бы порекомендовал формат даты ISO-8601:

YYYYMMDD

или

YYYY-MM-DDTHH:MM:SS

Те, которые всегда работают, всегда могут быть преобразованы, независимо от даты вашего SQL Server, региональных и языковых настроек ...

Обновление:

Преобразование существующих строк в DATE или DATETIME сильно зависит от ваших языковых / региональных настроек:

DECLARE @string1 VARCHAR(25) = '10.7.2010'
DECLARE @string2 VARCHAR(25) = '7/11/2010 7:36:55 AM'
DECLARE @string3 VARCHAR(25) = '7/13/2010 3:33:45 PM'

SET DATEFORMAT MDY

SELECT 
    CAST(@string1 AS DATE),
    CAST(@string2 AS DATETIME),
    CAST(@string2 AS DATETIME)

Результат здесь:

2010-10-07  2010-07-11 07:36:55.000   2010-07-13 07:36:55.000

Даты интерпретируются как7 октября 2010 г., 11 июля 2011 г. и 13 июля 2010 г.

SET DATEFORMAT dmy

SELECT 
    CAST(@string1 AS DATE),
    CAST(@string2 AS DATETIME)

Результат здесь:

2010-07-10  2010-11-07 07:36:55.000

Даты интерпретируются как 10 июля 2010 г. и 7 ноября 2011 г.

И , конечно , конвертируя @string3 в дату с этими настройкамипотерпит неудачу, так как он пытается интерпретировать его как 7-й из 13-го месяца ..... а 13-го месяца нет .....

Из-за таких неясностей я бы рекомендовал всегда использовать ISO-8601 форматы, которые понятны, стандартизированы, всегда работают, и всегда определены какая дата действительно представлена.

Обновление # 2 :

Конечно, вы также можете использовать функцию проверки ISDATE(), если данную строку можно интерпретировать как действительную дату:

SELECT DateStr, ISDATE(DateStr) FROM dbo.YourTable

В случае SET DATEFORMAT DMY, строковое значение '7/13/2010 3:33:45 PM'будет признан недействительным:

SET DATEFORMAT DMY
SELECT ISDATE('7/13/2010 3:33:45 PM')

возвращает 0 в качестве значения.

0 голосов
/ 07 июля 2011

Я не обнаружил никакой ошибки при преобразовании вышеуказанных значений в преобразование даты и времени. Я думаю, что у вас есть данные с неправильным форматом даты. Пожалуйста, поделитесь такими данными, чтобы получить больше помощи. значит, при проверке запроса, чтобы получить значение даты ..

Declare @Table Table
(
    DateTimeCol varchar(100)
)
insert into @Table
Select '10.7.2010' UNION ALL
Select '7/11/2010 7:36:55 AM'

Select Convert(varchar,DateTimeCol,101) As Date
From @Table
0 голосов
/ 07 июля 2011

Попробуйте использовать CAST и str_to_date

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