Я хочу преобразовать строку следующим образом:
'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
tsql
datetime
sql-server-2005
string-to-datetime
JosephStyons
источник
источник
Ответы:
SQL Server (2005, 2000, 7.0) не имеет какого-либо гибкого или даже негибкого способа получения произвольно структурированного datetime в строковом формате и преобразования его в тип данных datetime.
Под «произвольно» я подразумеваю «форму, которую человек, который ее написал, хотя, возможно, не вы, я или кто-то на другой стороне планеты, сочли бы ее интуитивной и совершенно очевидной». Честно говоря, я не уверен, что есть такой алгоритм.
источник
9/6/12
виду введенный пользователь 6 сентября 2012 г., 9 июня 2012 г., 6 декабря 2009 г. или что-то еще?Попробуй это
и
См. CAST и CONVERT (Transact-SQL) для более подробной информации.
источник
Cast('2011-07-07' as datetime)
также работает, и устраняет неоднозначность по месяцам и дням.SET DATEFORMAT dmy
перед вашим запросомЗапустите это через ваш процессор запросов. Он форматирует даты и / или время примерно так, и один из них должен дать вам то, что вы ищете. Это не будет трудно адаптировать:
источник
В SQL Server Denali вы сможете делать то, что подходит к тому, что вы ищете. Но вы все равно не можете просто передать произвольно заданную причудливую строку даты и ожидать, что SQL Server будет соответствовать. Вот один из примеров, который вы использовали в своем ответе. Функция FORMAT () также может принимать локали в качестве необязательного аргумента - она основана на формате .Net, поэтому большинство, если не все форматы токенов, которые вы ожидаете увидеть, будут там.
Я настоятельно рекомендую вам взять под контроль и обезопасить ваши данные даты. Дни, когда люди могли печатать даты в произвольном формате в нужном формате, должны быть далеко позади. Если кто-то входит 9.09.2011, то это 9 августа или 8 сентября? Если вы заставите их выбрать дату в элементе управления календаря, то приложение сможет контролировать формат. Независимо от того, сколько вы пытаетесь предсказать поведение ваших пользователей, они всегда найдут более тупой способ ввести дату, которую вы не планировали.
До Денали, тем не менее, я думаю, что @Ovidiu имеет лучший совет на данный момент ... это можно сделать довольно тривиальным путем реализации вашей собственной функции CLR. Затем вы можете написать case / switch для любого количества нестандартных нестандартных форматов.
ОБНОВЛЕНИЕ для @dhergert :
Полученные результаты:
Вы все еще должны иметь эту другую важную информацию в первую очередь. Вы не можете использовать собственный T-SQL, чтобы определить,
6/9/2012
будет ли 9 июня или 6 сентября.источник
Для этой проблемы лучшее решение, которое я использую, - это иметь функцию CLR в Sql Server 2005, которая использует одну из функций DateTime.Parse или ParseExact для возврата значения DateTime в указанном формате.
источник
Использовать это:
И обратитесь к таблице в официальной документации для преобразования кодов.
источник
почему бы не попробовать
форматы дат можно найти в разделе Помощник по SQL Server> Форматы даты в SQL Server.
источник
select convert(date,'10/15/2011 00:00:00',101)
. Более подробную информацию о формате и почему 101, на docs.microsoft.com/en-us/sql/t-sql/functions/...Мне потребовалась минута, чтобы понять это, так что вот, если это может кому-то помочь:
В SQL Server 2012 и выше вы можете использовать эту функцию:
Вот как я закончил извлекать части даты для вставки в эту функцию:
источник
На этой странице есть некоторые ссылки на все указанные преобразования даты и времени, доступные для функции CONVERT. Если ваши значения не попадают в один из приемлемых шаблонов, то я думаю, что лучше всего пойти по пути ParseExact.
источник
Лично, если вы имеете дело с произвольными или полностью нестандартными форматами, при условии, что вы знаете, что они опередили или будут делать это, просто используйте regexp, чтобы получить нужные вам отрезки даты и сформировать действительный компонент date / datetime.
источник
Я знаю, что это злой старый пост с множеством ответов, но многие люди думают, что им НУЖНО либо разбить вещи на части и собрать их обратно, либо они настаивают на том, что нет способа неявно выполнить преобразование, запрошенное оригиналом OP ,
Чтобы просмотреть и, надеюсь, дать легкий ответ другим людям с таким же вопросом, ФП спросил, как преобразовать '10/15/2008 10:06:32 PM' в DATETIME. Теперь у SQL Server есть некоторые языковые зависимости для временных преобразований, но если язык английский или что-то похожее, это становится простой проблемой ... просто выполните преобразование и не беспокойтесь о формате. Например (и вы можете использовать CONVERT или CAST) ...
... и это дает следующие ответы, оба из которых являются правильными.
Как говорят в телевизионной рекламе: «Но подождите! Пока не заказывайте! Без дополнительных затрат, это может сделать ГЛАВНОЕ!»
Давайте посмотрим на реальную силу временных преобразований с помощью DATETIME и частично рассмотрим ошибку, известную как DATETIME2. Посмотрите на странные форматы, которые DATETIME может обрабатывать автоматически, а DATETIME2 - нет. Запустите следующий код и посмотрите ...
Итак, да ... SQL Server на самом деле имеет довольно гибкий метод обработки всевозможных странных временных форматов, и никакой специальной обработки не требуется. Нам даже не нужно было удалять «PM», которые были добавлены к 24-часовым временам. Это "PFM" (Pure Freakin 'Magic).
Все будет немного различаться в зависимости от ЯЗЫКА, который вы выбрали для своего сервера, но многое из этого будет обработано в любом случае.
И эти «автоматические» преобразования не являются чем-то новым. Они идут очень далеко назад.
источник
Если вы хотите, чтобы SQL Server попытался это выяснить, просто используйте CAST CAST («как угодно», как дата / время). Однако в целом это плохая идея. Есть проблемы с международными датами, которые могут возникнуть. Итак, как вы обнаружили, чтобы избежать этих проблем, вы хотите использовать ODBC канонический формат даты. То есть формат № 120, 20 - это формат для двухзначных лет. Я не думаю, что SQL Server имеет встроенную функцию, которая позволяет вам предоставлять пользовательский формат. Вы можете написать свое собственное и даже найти его, если будете искать в Интернете.
источник
неявное преобразование строки в datetime в MSSQL
источник
источник