Вопрос

Я хочу преобразовать строку следующим образом:

'10/15/2008 10:06:32 PM'

в эквивалентное значение DATETIME на Sql Server.

В Oracle я бы сказал так:

TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')

Этот вопрос подразумевает, что я должен проанализировать строку в один из стандартные форматы, а затем конвертируйте с помощью одного из этих кодов.Это кажется смехотворным для такой обыденной операции.Есть ли более простой способ?

Это было полезно?

Решение

SQL Server (2005, 2000, 7.0) не имеет какого-либо гибкого или даже негибкого способа получения произвольно структурированного значения datetime в строковом формате и преобразования его в тип данных datetime.

Под «произвольно» я имею в виду «форму, которую человек, который ее написал, хотя, возможно, не вы, или я или кто -то на другой стороне планеты, считает интуитивно понятным и совершенно очевидным». Честно говоря, я не уверен, что есть такой алгоритм.

Другие советы

Попробуй это

Cast('7/7/2011' as datetime)

и

Convert(varchar(30),'7/7/2011',102)

Видеть CAST и CONVERT (Transact-SQL) Больше подробностей.

Пропустите это через свой процессор запросов.Он форматирует даты и/или время таким образом, и один из них должен дать вам то, что вы ищете.Адаптироваться не составит труда:

Declare @d datetime
select @d = getdate()

select @d as OriginalDate,
convert(varchar,@d,100) as ConvertedDate,
100 as FormatValue,
'mon dd yyyy hh:miAM (or PM)' as OutputFormat
union all
select @d,convert(varchar,@d,101),101,'mm/dd/yy'
union all
select @d,convert(varchar,@d,102),102,'yy.mm.dd'
union all
select @d,convert(varchar,@d,103),103,'dd/mm/yy'
union all
select @d,convert(varchar,@d,104),104,'dd.mm.yy'
union all
select @d,convert(varchar,@d,105),105,'dd-mm-yy'
union all
select @d,convert(varchar,@d,106),106,'dd mon yy'
union all
select @d,convert(varchar,@d,107),107,'Mon dd, yy'
union all
select @d,convert(varchar,@d,108),108,'hh:mm:ss'
union all
select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
union all
select @d,convert(varchar,@d,110),110,'mm-dd-yy'
union all
select @d,convert(varchar,@d,111),111,'yy/mm/dd'
union all
select @d,convert(varchar,@d,12),12,'yymmdd'
union all
select @d,convert(varchar,@d,112),112,'yyyymmdd'
union all
select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
union all
select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
union all
select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'

В SQL Server Denali вы сможете делать то, что вам нужно.Но вы все равно не можете просто передать любую произвольно определенную строку даты и ожидать, что SQL Server ее приспособит.Вот один из примеров использования того, что вы опубликовали в своем собственном ответе.Функция FORMAT() также может принимать локали в качестве необязательного аргумента — она основана на формате .Net, поэтому там будут присутствовать большинство, если не все, форматы токенов, которые вы ожидаете увидеть.

DECLARE @d DATETIME = '2008-10-13 18:45:19';

-- returns Oct-13/2008 18:45:19:
SELECT FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss');

-- returns NULL if the conversion fails:
SELECT TRY_PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

-- returns an error if the conversion fails:
SELECT PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

Я настоятельно рекомендую вам взять больше контроля и очистить вводимые данные.Дни, когда люди могли вводить даты в любом формате, который они хотят, в поле формы с произвольным текстом, уже давно позади.Если кто-то войдет 09.08.2011, это будет 9 августа или 8 сентября?Если вы предложите им выбрать дату в элементе управления календарем, приложение сможет управлять форматом.Независимо от того, сколько вы пытаетесь предсказать поведение своих пользователей, они всегда найдут более глупый способ ввести дату, которую вы не планировали.

Однако до Денали я думаю, что @Ovidiu дал лучший совет на данный момент...это можно сделать довольно тривиально, реализовав собственную функцию CLR.Затем вы сможете написать регистр/переключатель для любого количества дурацких нестандартных форматов.


ОБНОВЛЕНИЕ для @dhergert:

SELECT TRY_PARSE('10/15/2008 10:06:32 PM' AS DATETIME USING 'en-us');
SELECT TRY_PARSE('15/10/2008 10:06:32 PM' AS DATETIME USING 'en-gb');

Полученные результаты:

2008-10-15 22:06:32.000
2008-10-15 22:06:32.000

Вам все равно сначала нужно получить еще одну важную информацию.Вы не можете использовать собственный T-SQL, чтобы определить, 6/9/2012 9 июня или 6 сентября.

Для этой проблемы лучшим решением, которое я использую, является наличие функции CLR в Sql Server 2005, которая использует одну из функций DateTime.Parse или ParseExact для возврата значения DateTime в указанном формате.

почему бы не попробовать

select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY]

форматы даты можно найти по адресу Помощник по SQL Server > Форматы даты SQL Server

Использовать это:

SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm

И обратитесь к таблице в официальная документация для кодов преобразования.

Этот страница содержит некоторые ссылки на все указанные преобразования даты и времени, доступные для функции CONVERT.Если ваши значения не попадают ни в один из приемлемых шаблонов, то, я думаю, лучше всего пойти по пути ParseExact.

Лично, если вы имеете дело с произвольными или совершенно нестандартными форматами, при условии, что вы заранее знаете, какими они будут или будут, просто используйте регулярное выражение, чтобы извлечь нужные разделы даты и сформировать действительный компонент даты/даты.

Если вы хотите, чтобы SQL Server попробовал его выяснить, просто используйте CAST CAST («Что угодно» как DateTime), однако это плохая идея в целом.Могут возникнуть проблемы с международными датами.Итак, как вы обнаружили, чтобы избежать этих проблем, вам нужно использовать канонический формат даты ODBC.Это номер формата 120, 20 — это формат всего двухзначного года.Я не думаю, что в SQL Server есть встроенная функция, которая позволяет вам предоставлять заданный пользователем формат.Вы можете написать свой собственный и даже найти его, если будете искать в Интернете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top