Учитывая следующие компоненты
DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
Как лучше всего объединить их, чтобы получить DATETIME2(7)
результат со стоимостью '2013-10-13 23:59:59.9999999'
?
Некоторые вещи, которые не работают, перечислены ниже.
SELECT @D + @T
Дата типа данных операнда недопустима для оператора добавления.
SELECT CAST(@D AS DATETIME2(7)) + @T
Тип данных операнда datetime2 недопустим для оператора добавления.
SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
Функция datediff привела к переполнению. Число частей даты, разделяющих два экземпляра даты / времени, слишком велико. Попробуйте использовать datediff с менее точной частью даты.
* Переполнения можно избежать в базе данных SQL Azure и SQL Server 2016, используя DATEDIFF_BIG
.
SELECT CAST(@D AS DATETIME) + @T
Типы данных datetime и time несовместимы в операторе добавления.
SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Возвращает результат, но теряет точность
2013-10-13 23:59:59.997
Для SQL Server 2012 и выше есть функция DATETIME2FROMPARTS . Это имеет такую форму:
Для данных данного образца это становится
что приводит к
Части могут быть получены с использованием DATEPART (), если они начинаются с временных типов данных или из текста, используемого для построения значений выборки в вопросе.
источник
SQL Server довольно глупо не позволять вашему первому примеру работать, и это тоже будет казаться очень глупым, но…
источник
источник
Я искал что-то еще, когда я приземлился здесь. Вопрос довольно старый, но есть недавние комментарии и активность. Думаю, я бы поделился простым методом, который очень похож на ответ, который дал @Atario, но немного короче, и некоторые из них могут оказаться более легкими для чтения:
источник
Вы можете усечь с приведением к DATE для усечения, затем вернуться к DATETIME, чтобы добавить ВРЕМЯ
источник