Как извлечь только часть даты из значения DateTime в SQL Server
При использовании SELECT GETDATE() в SQL Server возвращаются как компоненты даты, так и времени, например, 2008-09-22 15:24:13.790. Как можно извлечь только часть даты в формате 2008-09-22 00:00:00.000?
Самый простой способ извлечь только часть даты из значения datetime в SQL Server - это использовать функции CAST() или CONVERT() для преобразования datetime в тип date, или использовать функцию DATEFROMPARTS(). Например, CAST(GETDATE() AS DATE) вернет только часть даты, в то время как CONVERT(DATE, GETDATE()) достигает того же результата с большими возможностями форматирования.
Содержание
- Использование функции CAST
- Использование функции CONVERT
- Использование функции DATEFROMPARTS
- Использование функций DATEADD и DATEDIFF
- Использование функции FORMAT
- Сравнение методов
- Лучшие практики
Использование функции CAST
Функция CAST() - это самый простой способ извлечь часть даты из значения datetime в SQL Server. При приведении значения datetime к типу date, SQL Server автоматически удаляет временную компоненту.
SELECT CAST(GETDATE() AS DATE) AS ExtractedDate;
Этот запрос вернет текущую дату со временем, установленным в 00:00:00.000. Например, если GETDATE() возвращает 2008-09-22 15:24:13.790, то результатом будет 2008-09-22.
Важное замечание: Тип данных
DATEбыл введен в SQL Server 2008. Если вы работаете с более старой версией SQL Server, вам потребуется использовать альтернативные методы.
Использование функции CONVERT
Функция CONVERT() обеспечивает большую гибкость и возможности форматирования при извлечении части даты из значения datetime.
SELECT CONVERT(DATE, GETDATE()) AS ExtractedDate;
Вы также можете использовать коды стиля с CONVERT для форматирования вывода по-разному:
-- Преобразование в date, а затем обратно в datetime со временем полуночи
SELECT CONVERT(DATETIME, CONVERT(DATE, GETDATE())) AS ExtractedDateTime;
Этот подход особенно полезен, когда необходимо сохранить тип данных datetime, при этом устраняя временную компоненту.
Использование функции DATEFROMPARTS
Функция DATEFROMPARTS() позволяет вам построить значение даты из отдельных компонентов года, месяца и дня. Хотя этот метод более многословный, он полезен для манипуляций с датами:
SELECT DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE())) AS ExtractedDate;
Этот метод особенно ценен, когда вам нужно выполнять сложные операции с датами или когда вы работаете с отдельными компонентами даты перед их восстановлением.
Использование функций DATEADD и DATEDIFF
Вы также можете использовать математический подход с функциями DATEADD и DATEDIFF для удаления временной компоненты:
SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) AS ExtractedDate;
Это работает следующим образом:
- Вычисление количества дней с базовой даты (0)
- Добавление этого количества дней обратно к базовой дате
- Это эффективно удаляет временную компоненту
Использование функции FORMAT
Для SQL Server 2012 и более поздних версий вы можете использовать функцию FORMAT() для извлечения части даты:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd') AS ExtractedDate;
Однако учтите, что FORMAT() возвращает тип данных varchar, а не date или datetime, что может потребовать дополнительного преобразования, если вам нужно выполнять операции с датами над результатом.
Сравнение методов
| Метод | Версия SQL Server | Тип возвращаемого значения | Производительность | Случай использования |
|---|---|---|---|---|
CAST(GETDATE() AS DATE) |
2008+ | DATE | Отличная | Простое извлечение даты |
CONVERT(DATE, GETDATE()) |
2008+ | DATE | Отличная | Извлечение даты с опциями |
DATEFROMPARTS() |
2012+ | DATE | Хорошая | Сложные операции с датами |
DATEADD/DATEDIFF |
Все | DATETIME | Хорошая | Устаревшие версии SQL Server |
FORMAT() |
2012+ | VARCHAR | Плохая | Требования к форматированию строк |
Лучшие практики
-
Выберите правильный тип данных: Используйте тип данных
DATE, когда вам нужна только информация о дате, так как он более эффективен с точки зрения хранения и предотвращает ошибки, связанные со временем. -
Учитывайте версию SQL Server: Будьте осведомлены о совместимости версий при выборе методов извлечения.
-
Соображения о производительности:
CAST()иCONVERT()обычно являются самыми быстрыми методами для простого извлечения даты. -
Обработка часовых поясов: Помните, что значения datetime в SQL Server не хранят информацию о часовом поясе. Если вам нужно обрабатывать часовые пояса, рассмотрите возможность использования
DATETIME2с часовым поясом или преобразования на уровне приложения. -
Индексация: При фильтрации по дате убедитесь, что вы используете соответствующие функции даты, которые позволяют использование индексов. Избегайте функций, которые предотвращают поиск по индексу.
Для вашего конкретного требования получения 2008-09-22 00:00:00.000 из 2008-09-22 15:24:13.790, наиболее эффективным решением было бы:
SELECT CONVERT(DATETIME, CAST(GETDATE() AS DATE)) AS ExtractedDateTime;
Это преобразует datetime в date (удаляя время) и затем обратно в тип datetime с временем полуночи, давая вам именно тот формат, который вы запросили.
Заключение
Извлечение части даты из значения datetime в SQL Server может быть выполнено несколькими методами в зависимости от ваших конкретных потребностей и версии SQL Server. Функции CAST() и CONVERT() предлагают наиболее простые и производительные решения для современных версий SQL Server (2008 и более поздних). Для сохранения типа данных datetime при установке времени на полночь, использование CONVERT(DATETIME, CAST(GETDATE() AS DATE)) предоставляет именно тот формат, который вам нужен. Всегда учитывайте вашу версию SQL Server, требования к производительности и совместимость типов данных при выборе подходящего метода для вашего случая использования.