Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

Извлечение даты из DateTime в SQL Server: без времени

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

Извлечение даты из типа данных DateTime можно выполнить таким образом:

SQL
Скопировать код
SELECT CAST(GETDATE() AS DATE)

Вы получите результат в формате только дата (ГГГГ-ММ-ДД), который идеально подходит для SQL Server 2008+.

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

Решения для более ранних версий

Функция CONVERT

Для версий SQL Server, которые были актуальны в 90-х, помощником может стать функция CONVERT:

SQL
Скопировать код
-- Возвращает ГГГГ-ММ-ДД
SELECT CONVERT(VARCHAR(10), GETDATE(), 120)

Обратите внимание, что использование VARCHAR вместе с локализацией возможно не всегда приводит к ожидаемому результату, будьте бдительны!

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Применение функций DATEADD и DATEDIFF

При необходимости преобразования типов данных без привязки к определенной территории функции DATEADD и DATEDIFF станут вашими лучшими помощниками:

SQL
Скопировать код
-- Возвращает дату и "полночь" в качестве времени
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Данный подход обеспечивает получение результата типа datetime, где время будет равно 00:00. Плюс данного преобразования в том, что оно не зависит от локальных настроек.

Возможные проблемы

Преобразование строк: будьте осмотрительны!

Многие из нас предпочитают экспресс-решения, но, как гласит поговорка, «не всякий блеск – золото». Это утверждение относится и к CONVERT(VARCHAR(10), ...). Обращайте внимание на языковые настройки.

Часовые пояса: они могут влиться в хаос!

Часовые пояса могут привести к непредсказуемому поведению данных о времени и дате. Не забывайте, что SQL Server использует формат UTC для DateTime.

Производительность: она важна!

Применение функций для индексированных столбцов может замедлить производительность запроса. Обращайте на это внимание!

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

Можно представить процесс преобразования DateTime в дату как очиститель для фруктов, который из апельсина (DateTime) выделяет сочную мякоть (дату):

Markdown
Скопировать код
Тип данных DateTime: 🕒📅 (Дата & Время)

Наш SQL-очиститель:

SQL
Скопировать код
CAST(🕒📅 AS DATE)

Результат преобразования:

Markdown
Скопировать код
Только дата: 📅 (Только дата)

Вот она, идеальная дата – без лишнего времени!

Советы по оптимизации преобразования

Индексация таблиц: планируйте заранее

Использование функций на индексированных столбцах в условиях WHERE или JOIN может понизить производительность. Но предварительное расчет значений только даты в отдельном индексированном столбце может подправить обстановку!

NULL значения: внимание

Учтите вероятность наличия значений null:

SQL
Скопировать код
-- Лучше перестраховаться!
SELECT CAST(ISNULL(columnName, GETDATE()) AS DATE) FROM tableName

С NULL значениями следует быть осторожным!

Нетленные правила работы с датами

Есть неизменные принципы, которые следует соблюдать при работе с датами:

  • Стараетесь использовать форматы даты в соответствии со стандартом ANSI (ГГГГ-ММ-ДД) – это исключит двусмысленность.
  • Избегайте использования BETWEEN для сравнения дат, вместо него используйте >= и < – это поможет избежать ошибок при вычислении границ.
  • Не забывайте о часовых поясах и переходе на летнее время, чтобы не столкнуться с нежелательными сюрпризами!

Полезные ресурсы

  1. CAST and CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — изучите создание преобразований с помощью функций CAST и CONVERT.
  2. Date and Time Data Types and Functions – SQL Server (Transact-SQL) | Microsoft Learn — централизованное место с информацией о функциях даты и времени в SQL Server.
  3. FORMAT (Transact-SQL) – SQL Server | Microsoft Learn — различные способы форматирования даты.
  4. Date Functions in SQL Server and MySQL – W3Schools — обзор распространенных функций для работы с датами.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как в SQL Server 2008+ извлечь только дату из типа данных DateTime?
1 / 5