Создание даты из дня, месяца и года в T-SQL: примеры и методы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для создания даты из дня, месяца и года используйте функцию DATEFROMPARTS(год, месяц, день) в T-SQL. Пример кода:

SQL
Скопировать код
SELECT DATEFROMPARTS(2023, 3, 15) AS РезультирующаяДата

Если версия SQL Server не поддерживает функцию DATEFROMPARTS, то можно решить данную задачу с помощью конкатенации строк и преобразования их типов:

SQL
Скопировать код
SELECT CAST('2023' + '-' + '03' + '-' + '15' AS DATE) AS РезультирующаяДата

Каждый из этих подходов позволяет эффективно создать дату.

Кинга Идем в IT: пошаговый план для смены профессии

Формирование даты: применение DATEFROMPARTS в SQL Server 2012+

В SQL Server 2012 и последующих версиях используйте DATEFROMPARTS для формирования даты. Это позволяет преобразовать значения столбцов или переменные:

SQL
Скопировать код
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):

SQL
Скопировать код
SELECT DATEADD(DAY, @day – 1,
       DATEADD(MONTH, @month – 1,
       DATEADD(YEAR, @year – 1900, CAST('1900-01-01' AS DATETIME)))) AS РезультирующаяДата

Оптимальное создание даты: избегайте преобразования строк

Советую использовать арифметику целых чисел для увеличения производительности. SQL Server хранит даты как количество дней с начала 1900 года. Общий подход – начать с коррекции года для учета високосных лет, затем продолжить с месяцами и днями.

Визуализация

Создание даты подобно сборке пазла:

🛠️ Необходимые элементы:

  • День (📆)
  • Месяц (🌐)
  • Год (📅)

Инструкция по сборке:

SQL
Скопировать код
DATEFROMPARTS(год, месяц, день)

Прекрасная работа! У вас получилась дата 🎉:

До: 📆 + 🌐 + 📅 После: 🗓️

Альтернативные методы формирования дат в T-SQL

Формирование даты с помощью арифметического подхода — порядок имеет значение

Порядок добавления значений важен — сначала года преобразуются в месяцы, затем добавляются месяцы и только в конце — дни:

SQL
Скопировать код
SELECT DATEADD(MONTH, ((@year – 1900) * 12) + @month – 1, 
       DATEADD(DAY, @day – 1, CAST('1900-01-01' AS DATETIME))) AS РезультирующаяДата

Конкатенация строк и преобразование типов

Гораздо менее продуктивный метод — конкатенация строки даты и последующее преобразование в дату, который можно использовать при необходимости:

SQL
Скопировать код
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 для предотвращения ошибок преобразования:

SQL
Скопировать код
SELECT TRY_CAST(
         TRY_CAST(@year AS VARCHAR(4)) + '-' + 
         FORMAT(@month, '00') + '-' + 
         FORMAT(@day, '00') AS DATE
       ) AS РезультирующаяДата

Форматирование однозначных месяцев и дней с ведущим нулем

Ведущие нули обеспечивают правильное форматирование строки даты в формате YYYY-MM-DD:

SQL
Скопировать код
SELECT CAST(FORMAT(@year, '0000') + '-' + FORMAT(@month, '00') + '-' + FORMAT(@day, '00') AS DATE) AS РезультирующаяДата

Полезные материалы

  1. CAST and CONVERT (Transact-SQL) – SQL Server | Microsoft Learn
  2. Date and Time Data Types and Functions – SQL Server (Transact-SQL) | Microsoft Learn
  3. Стандартизация шаблонов CRUD в SQL Server с планами отката
  4. Функции SQL Server – DateTime