Я пытаюсь преобразовать дату с отдельными частями, такими как 12, 1, 2007, в дату и время в SQL Server 2005. Я пробовал следующее:
CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
но это приводит к неправильной дате. Как правильно преобразовать три значения даты в правильный формат даты и времени?
sql
sql-server
sql-server-2005
tsql
Brandon
источник
источник
Ответы:
Предполагая
y, m, d
, что всеint
, как насчет:Пожалуйста, смотрите мой другой ответ для SQL Server 2012 и выше
источник
yyyymmdd
Формат работает независимо от этих параметров. «Строка из шести или восьми цифр всегда интерпретируется как ymd ». docs.microsoft.com/en-us/sql/t-sql/data-types/… Посмотрите этот ответ: stackoverflow.com/a/46064419/2266979Попробуй это:
Он также работает, имеет дополнительное преимущество, заключающееся в том, что он не выполняет никаких преобразований строк, так что это чисто арифметическая обработка (очень быстрая) и он не зависит ни от какого формата даты. Это основывается на том факте, что внутреннее представление SQL Server для значений datetime и smalldatetime является двумя. значение части, первая часть которой представляет собой целое число, представляющее количество дней с 1 января 1900 года, а вторая часть представляет собой десятичную дробь, представляющую дробную часть одного дня (для времени). Таким образом, целочисленное значение 0 (ноль) ) всегда переводится прямо в полночь 1 января 1900 года ...
или, благодаря предложению @brinary,
Отредактировано в октябре 2014 года. Как отмечает @cade Roux, в SQL 2012 появилась встроенная функция: она
DATEFROMPARTS(year, month, day)
делает то же самое.
Отредактировано 3 октября 2016 г. (Спасибо @bambams за это замечание и @brinary за исправление), Последнее решение, предложенное @brinary. не работает в високосные годы, если сначала не выполняется сложение лет
источник
@Year = 2001
,@Month = 13
и@DayOfMonth = 32
приводит к2002-02-01T00:00:00.000
. Принятый ответ (от Cade Roux) выдает ошибку, которая более полезна.В SQL Server 2012 есть замечательная и долгожданная новая функция DATEFROMPARTS (которая выдает ошибку, если дата недействительна - мое основное возражение против решения этой проблемы на основе DATEADD):
http://msdn.microsoft.com/en-us/library/hh213228.aspx
или
источник
Или используя только одну функцию dateadd:
источник
Sql Server 2012 имеет функцию, которая будет создавать дату на основе частей ( DATEFROMPARTS ). Для остальных из нас я создал функцию db, которая будет определять дату по частям (спасибо @Charles) ...
Вы можете назвать это так ...
Возвращает ...
источник
Попробуйте CONVERT вместо CAST.
CONVERT позволяет третий параметр, указывающий формат даты.
Список форматов находится здесь: http://msdn.microsoft.com/en-us/library/ms187928.aspx
Обновить после выбора другого ответа в качестве «правильного» ответа:
Я не очень понимаю, почему выбран ответ, который явно зависит от настроек NLS на вашем сервере, без указания этого ограничения.
источник
Вы также можете использовать
Работает в SQL с версии 2012 и AzureSQL
источник
Безопаснее и аккуратнее использовать явную отправную точку «19000101»
источник
declare @output datetime2 = 0
и вместо@Year - 1900
использования@Year - DATEPART(year,0);
? Это работает без каких-либо приведений в SQL Server 2008 и гораздо более понятно.Если вы не хотите исключать строки, это также работает (поместите это в функцию):
источник
Я добавляю однострочное решение, если вам нужна дата и время из даты и времени :
источник
Пытаться
источник
Для версий SQL Server ниже 12 я могу рекомендовать использование
CAST
в сочетании сSET DATEFORMAT
как вы создаете эти строки зависит от вас
источник
Попробуйте этот запрос:
Результат:
источник
Я знаю, что OP запрашивает ответ на SQL 2005, но вопрос довольно старый, поэтому, если вы используете SQL 2012 или выше, вы можете использовать следующее:
Ссылка: https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions
источник
Я лично предпочитаю подстроку, так как она обеспечивает параметры очистки и возможность разбивать строку по мере необходимости. Предполагается, что данные имеют формат «дд, мм, гггг».
Вот демонстрация того, как на него можно подать иск, если данные хранятся в столбце. Излишне говорить, что он идеально подходит для проверки набора результатов перед применением к столбцу
источник