Функция DATEFROMPARTS

Функция DATEFROMPARTS появилась в SQL Server версии 2012.

У функции DATEFROMPARTS 3 целочисленных аргумента, представляющих собой год, месяц и день, а возвращаемое значение есть соответствующая дата типа DATE. Она даёт удобный способ формирования даты, когда её компоненты хранятся отдельно или передаются с клиента.

Например,

SELECT DATEFROMPARTS(2017, 5, 25);
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

вернёт

2017-05-25

Получить дату 25 числа текущего месяца можно так

select DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP), MONTH(CURRENT_TIMESTAMP), 25);
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

Помимо даты можно “собирать” значения типа времени и временной метки (datetime), используя компоненты времени - часы, минуты, секунды и доли секунды. Например, следующий запрос

SELECT TIMEFROMPARTS(9, 38, 59, 998, 7);
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
даст значение типа TIME:

09:38:59.0000998

Обратите внимание на последний параметр, который указывает на число знаков в представлении долей секунды. Этот целочисленный параметр может принимать значение от 0 до 7, но не может быть меньше числа цифр в представлении долей секунды.

Например,

SELECT TIMEFROMPARTS(9, 38, 59, 998, 3);
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
вернет

09:38:59.998

в то время как

SELECT TIMEFROMPARTS(9, 38, 59, 998, 2);
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]
вернет ошибку:

Cannot construct data type time, some of the arguments have values which are not valid.

(Не удалось сконструировать тип данных time. Некоторые аргументы имеют недопустимые значения.)

Сравните с

SELECT TIMEFROMPARTS(9, 38, 59, 098, 2), TIMEFROMPARTS(9, 38, 59, 098, 3);
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

Результат

09:38:59.9809:38:59.098

Функция DATETIMEFROMPARTS формирует значение типа DATETIME. Она имеет семь целочисленных параметров: год, месяц, день, часы, минуты, секунды, миллисекунды. При этом миллисекунды округляются с точностью до одного из значений:  .000, .003, .007.

SELECT DATETIMEFROMPARTS(2017, 5, 13, 9, 38, 59, 998),
       DATETIMEFROMPARTS(2017, 5, 13, 9, 38, 59, 999),
       DATETIMEFROMPARTS(2017, 5, 13, 9, 38, 59, 993);
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

Результат

2017-05-13 09:38:59.9972017-05-13 09:39:00.0002017-05-13 09:38:59.993