Извлечение даты из DateTime в SQL Server: без времени
Быстрый ответ
Извлечение даты из типа данных DateTime
можно выполнить таким образом:
SELECT CAST(GETDATE() AS DATE)
Вы получите результат в формате только дата (ГГГГ-ММ-ДД), который идеально подходит для SQL Server 2008+.
Решения для более ранних версий
Функция CONVERT
Для версий SQL Server, которые были актуальны в 90-х, помощником может стать функция CONVERT
:
-- Возвращает ГГГГ-ММ-ДД
SELECT CONVERT(VARCHAR(10), GETDATE(), 120)
Обратите внимание, что использование VARCHAR
вместе с локализацией возможно не всегда приводит к ожидаемому результату, будьте бдительны!
Применение функций DATEADD и DATEDIFF
При необходимости преобразования типов данных без привязки к определенной территории функции DATEADD
и DATEDIFF
станут вашими лучшими помощниками:
-- Возвращает дату и "полночь" в качестве времени
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Данный подход обеспечивает получение результата типа datetime, где время будет равно 00:00. Плюс данного преобразования в том, что оно не зависит от локальных настроек.
Возможные проблемы
Преобразование строк: будьте осмотрительны!
Многие из нас предпочитают экспресс-решения, но, как гласит поговорка, «не всякий блеск – золото». Это утверждение относится и к CONVERT(VARCHAR(10), ...)
. Обращайте внимание на языковые настройки.
Часовые пояса: они могут влиться в хаос!
Часовые пояса могут привести к непредсказуемому поведению данных о времени и дате. Не забывайте, что SQL Server использует формат UTC для DateTime
.
Производительность: она важна!
Применение функций для индексированных столбцов может замедлить производительность запроса. Обращайте на это внимание!
Визуализация
Можно представить процесс преобразования DateTime
в дату как очиститель для фруктов, который из апельсина (DateTime
) выделяет сочную мякоть (дату):
Тип данных DateTime: 🕒📅 (Дата & Время)
Наш SQL-очиститель:
CAST(🕒📅 AS DATE)
Результат преобразования:
Только дата: 📅 (Только дата)
Вот она, идеальная дата – без лишнего времени!
Советы по оптимизации преобразования
Индексация таблиц: планируйте заранее
Использование функций на индексированных столбцах в условиях WHERE или JOIN может понизить производительность. Но предварительное расчет значений только даты в отдельном индексированном столбце может подправить обстановку!
NULL значения: внимание
Учтите вероятность наличия значений null:
-- Лучше перестраховаться!
SELECT CAST(ISNULL(columnName, GETDATE()) AS DATE) FROM tableName
С NULL
значениями следует быть осторожным!
Нетленные правила работы с датами
Есть неизменные принципы, которые следует соблюдать при работе с датами:
- Стараетесь использовать форматы даты в соответствии со стандартом ANSI (
ГГГГ-ММ-ДД
) – это исключит двусмысленность. - Избегайте использования
BETWEEN
для сравнения дат, вместо него используйте>=
и<
– это поможет избежать ошибок при вычислении границ. - Не забывайте о часовых поясах и переходе на летнее время, чтобы не столкнуться с нежелательными сюрпризами!
Полезные ресурсы
- CAST and CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — изучите создание преобразований с помощью функций CAST и CONVERT.
- Date and Time Data Types and Functions – SQL Server (Transact-SQL) | Microsoft Learn — централизованное место с информацией о функциях даты и времени в SQL Server.
- FORMAT (Transact-SQL) – SQL Server | Microsoft Learn — различные способы форматирования даты.
- Date Functions in SQL Server and MySQL – W3Schools — обзор распространенных функций для работы с датами.