Создание даты из дня, месяца и года в T-SQL: примеры и методы
Быстрый ответ
Для создания даты из дня, месяца и года используйте функцию DATEFROMPARTS(год, месяц, день)
в T-SQL. Пример кода:
SELECT DATEFROMPARTS(2023, 3, 15) AS РезультирующаяДата
Если версия SQL Server не поддерживает функцию DATEFROMPARTS
, то можно решить данную задачу с помощью конкатенации строк и преобразования их типов:
SELECT CAST('2023' + '-' + '03' + '-' + '15' AS DATE) AS РезультирующаяДата
Каждый из этих подходов позволяет эффективно создать дату.
Формирование даты: применение DATEFROMPARTS
в SQL Server 2012+
В SQL Server 2012 и последующих версиях используйте DATEFROMPARTS
для формирования даты. Это позволяет преобразовать значения столбцов или переменные:
DECLARE @year INT = 2023, @month INT = 3, @day INT = 15;
SELECT DATEFROMPARTS(@year, @month, @day) AS РезультирующаяДата
Эта функция проводит проверку валидности значений и отбрасывает некорректные даты.
Формирование даты в старых версиях SQL Server
Если версия сервера не поддерживает DATEFROMPARTS
, в SQL Server 2005 вы можете создать дату с помощью функций DATEADD
, последовательно начиная с базовой даты (1900-01-01):
SELECT DATEADD(DAY, @day – 1,
DATEADD(MONTH, @month – 1,
DATEADD(YEAR, @year – 1900, CAST('1900-01-01' AS DATETIME)))) AS РезультирующаяДата
Оптимальное создание даты: избегайте преобразования строк
Советую использовать арифметику целых чисел для увеличения производительности. SQL Server хранит даты как количество дней с начала 1900 года. Общий подход – начать с коррекции года для учета високосных лет, затем продолжить с месяцами и днями.
Визуализация
Создание даты подобно сборке пазла:
🛠️ Необходимые элементы:
- День (📆)
- Месяц (🌐)
- Год (📅)
Инструкция по сборке:
DATEFROMPARTS(год, месяц, день)
Прекрасная работа! У вас получилась дата 🎉:
До: 📆 + 🌐 + 📅 После: 🗓️
Альтернативные методы формирования дат в T-SQL
Формирование даты с помощью арифметического подхода — порядок имеет значение
Порядок добавления значений важен — сначала года преобразуются в месяцы, затем добавляются месяцы и только в конце — дни:
SELECT DATEADD(MONTH, ((@year – 1900) * 12) + @month – 1,
DATEADD(DAY, @day – 1, CAST('1900-01-01' AS DATETIME))) AS РезультирующаяДата
Конкатенация строк и преобразование типов
Гораздо менее продуктивный метод — конкатенация строки даты и последующее преобразование в дату, который можно использовать при необходимости:
SELECT CAST(CAST(@year AS VARCHAR(4)) + '-' + RIGHT('0' + CAST(@month AS VARCHAR(2)), 2) + '-' + RIGHT('0' + CAST(@day AS VARCHAR(2)), 2) AS DATE) AS РезультирующаяДата
Не забудьте форматировать однозначные месяцы и дни с ведущим нулем, чтобы соответствовать формату YYYY-MM-DD!
Частые ошибки и способы их избежать
Проверка входных данных
Внимательно проверяйте входные данные и их типы. Используйте TRY_CONVERT
или TRY_CAST
для предотвращения ошибок преобразования:
SELECT TRY_CAST(
TRY_CAST(@year AS VARCHAR(4)) + '-' +
FORMAT(@month, '00') + '-' +
FORMAT(@day, '00') AS DATE
) AS РезультирующаяДата
Форматирование однозначных месяцев и дней с ведущим нулем
Ведущие нули обеспечивают правильное форматирование строки даты в формате YYYY-MM-DD:
SELECT CAST(FORMAT(@year, '0000') + '-' + FORMAT(@month, '00') + '-' + FORMAT(@day, '00') AS DATE) AS РезультирующаяДата