Как убрать время из даты sql
Чтобы убрать время из даты в SQL, можно использовать функцию DATE или CONVERT с указанием нужного формата.
Функция DATE :
SELECT DATE(column_name) FROM table_name;
Эта функция извлекает дату из столбца column_name и возвращает ее без времени. Результат будет иметь формат YYYY-MM-DD.
Функция CONVERT :
SELECT CONVERT(date, column_name) FROM table_name;
Функция CONVERT преобразует значение столбца column_name в тип date . Результат также будет иметь формат YYYY-MM-DD и не будет содержать времени.
Обратите внимание, что в зависимости от используемой СУБД и настроек сервера может потребоваться использовать иной формат для даты. Например, в MySQL можно использовать функцию DATE_FORMAT для преобразования даты в нужный формат. В любом случае, при использовании функций для изменения формата даты, следует учитывать особенности используемой СУБД и настроек сервера.
Выборка даты без времени
Подскажите запрос на выборку только даты из БД. Имеется строка в таблице формата TIMESTAMP 0000-0-0 00:00:00 , так вот как сделать что бы на экран выводилась только дата а не дата со временем .
Отслеживать
задан 17 янв 2013 в 9:47
1,665 5 5 золотых знаков 35 35 серебряных знаков 73 73 бронзовых знака
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
SELECT DATE_FORMAT( `date_field` , '%d %M %Y' ) AS `date_format` FROM `table_name`
Отслеживать
ответ дан 17 янв 2013 в 10:01
34k 1 1 золотой знак 31 31 серебряный знак 49 49 бронзовых знаков
А как сделать чтоб %M — на русском выводило?)
7 мая 2018 в 12:05
@junior-web-dev, запрос перед этим сделайте: SET lc_time_names = ‘ru_RU’;
7 мая 2018 в 12:43
SELECT DATE( some_field ) FROM some_table
Больше функций — красивых и разных.
Отслеживать
ответ дан 17 янв 2013 в 9:59
xEdelweiss xEdelweiss
9,114 17 17 серебряных знаков 31 31 бронзовый знак
В конце выбранного названия колонки дописать ::date, если я правильно вас понял.
Отслеживать
ответ дан 1 мар 2020 в 14:35
Вот пример, чтоб было более понятно. select shipments.ship_date::date,customer_id,publication, type from shipments, editions, stock ORDER BY publication;
GETDATE (Transact-SQL)
Возвращает текущую системную метку времени базы данных в виде значения datetime без смещения часового пояса базы данных. Это значение наследуется от операционной системы компьютера, на котором работает экземпляр SQL Server.
SYSDATETIME и SYSUTCDATETIME имеют большую точность в долях секунды, чем GETDATE и GETUTCDATE. SYSDATETIMEOFFSET включает смещение часового пояса, заданное в системе. SYSDATETIME, SYSUTCDATETIME и SYSDATETIMEOFFSET можно присваивать переменным любого типа даты и времени.
База данных SQL Azure (за исключением Управляемого экземпляра SQL Azure) и Azure Synapse Analytics используют время в формате UTC. Если необходимо интерпретировать сведения о дате и времени в часовом поясе, отличном от UTC, используйте AT TIME ZONE в Базе данных SQL Azure или Azure Synapse Analytics.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).
Синтаксис
GETDATE()
Тип возвращаемых данных
datetime
Remarks
Инструкции языка Transact-SQL могут ссылаться на функцию GETDATE в любом месте, где они могут ссылаться на выражение типа datetime.
GETDATE является недетерминированной функцией. Невозможно проиндексировать представления и выражения, ссылающиеся на эту функцию в столбце.
Использование SWITCHOFFSET с функцией GETDATE() может вызвать замедление выполнения запроса, поскольку оптимизатор запросов не может получить точные оценки количества элементов для значения GETDATE. Рекомендуется заранее вычислить значение GETDATE, а затем указать это значение в запросе, как показано в следующем примере. Кроме того, с помощью указания запроса OPTION (RECOMPILE) можно вынудить оптимизатор запросов повторно компилировать план запроса при каждом выполнении одного и того же запроса. В этом случае оптимизатор будет иметь точные оценки количества элементов для GETDATE(), что позволит ему сформировать более эффективный план запроса.
DECLARE @dt datetimeoffset = switchoffset (CONVERT(datetimeoffset, GETDATE()), '-04:00'); SELECT * FROM t WHERE c1 > @dt OPTION (RECOMPILE);
Примеры
В следующих примерах с помощью шести системных функций SQL Server, которые возвращают текущую дату и время, происходит возврат даты, времени или и того и другого. Значения возвращаются последовательно и поэтому могут различаться на доли секунды.
A. Получение текущей системной даты и времени
SELECT SYSDATETIME() ,SYSDATETIMEOFFSET() ,SYSUTCDATETIME() ,CURRENT_TIMESTAMP ,GETDATE() ,GETUTCDATE();
SYSDATETIME() 2007-04-30 13:10:02.0474381 SYSDATETIMEOFFSET()2007-04-30 13:10:02.0474381 -07:00 SYSUTCDATETIME() 2007-04-30 20:10:02.0474381 CURRENT_TIMESTAMP 2007-04-30 13:10:02.047 GETDATE() 2007-04-30 13:10:02.047 GETUTCDATE() 2007-04-30 20:10:02.047
Б. Получение текущей системной даты
SELECT CONVERT (date, SYSDATETIME()) ,CONVERT (date, SYSDATETIMEOFFSET()) ,CONVERT (date, SYSUTCDATETIME()) ,CONVERT (date, CURRENT_TIMESTAMP) ,CONVERT (date, GETDATE()) ,CONVERT (date, GETUTCDATE());
SYSDATETIME() 2007-05-03 SYSDATETIMEOFFSET() 2007-05-03 SYSUTCDATETIME() 2007-05-04 CURRENT_TIMESTAMP 2007-05-03 GETDATE() 2007-05-03 GETUTCDATE() 2007-05-04
В. Получение текущего системного времени
SELECT CONVERT (time, SYSDATETIME()) ,CONVERT (time, SYSDATETIMEOFFSET()) ,CONVERT (time, SYSUTCDATETIME()) ,CONVERT (time, CURRENT_TIMESTAMP) ,CONVERT (time, GETDATE()) ,CONVERT (time, GETUTCDATE());
SYSDATETIME() 13:18:45.3490361 SYSDATETIMEOFFSET() 13:18:45.3490361 SYSUTCDATETIME() 20:18:45.3490361 CURRENT_TIMESTAMP 13:18:45.3470000 GETDATE() 13:18:45.3470000 GETUTCDATE() 20:18:45.3470000
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
В приведенных ниже примерах с помощью трех системных функций SQL Server, которые возвращают текущую дату и время, происходит получение даты, времени или и того и другого. Значения возвращаются последовательно и поэтому могут различаться на доли секунды.
Г. Получение текущей системной даты и времени
SELECT SYSDATETIME() ,CURRENT_TIMESTAMP ,GETDATE();
Д. Получение текущей системной даты
SELECT CONVERT (date, SYSDATETIME()) ,CONVERT (date, CURRENT_TIMESTAMP) ,CONVERT (date, GETDATE());
Е. Получение текущего системного времени
SELECT CONVERT (time, SYSDATETIME()) ,CONVERT (time, CURRENT_TIMESTAMP) ,CONVERT (time, GETDATE());
MS SQL Server: Убираем время из значения типа datetime
Этот текст является в какой то мере переводом топика Kevin Jones — Removing time from SQL datetime, так что если вы хорошо знаете английский, то лучше, наверное, читать руководство из первых рук. Правда, мой вариант дополнен некоторыми тестами.
Итак, мы довольно часто используем SQL сервер для хранения данных с типом дата и время. В SQL Server 2005/2000 существуют два типа данных (специальных типов данных) для хранения даты и времени – это datetime и smalldatetime, разница между ними в возможностях хранения (от и до), точности времени и, соответственно, в количестве используемой памяти. В SQL Server 2008 появились дополнительные типы данных, такие как datetime2, time, date, datetimeoffset, о них вы можете прочитать в статье на MSDN — Типы данных и функции даты и времени (Transact-SQL).
Вернемся же к типу DATETIME. Часто возникает необходимость выбрать из типа DATETIME только дату, а время установить равным 0:00. Не приходиться об этом думать, когда нужно просто вывести результат – тогда все можно сделать форматом вывода, например в C# это может быть “dd.MM.yyyy”. Другое дело, если с данными нужно еще оперировать (например, группировать по дате или что то прибавить или убавить), тогда нам необходим тип DATETIME, в котором нам нужно обнулять время.
Первый вариант, как можно это сделать (до прочтения топика Kevin Jones’а я так всегда и делал) – это привести изначально тип DATETIME в VARCHAR без времени (определенным форматом) и обратно:
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(15), GETDATE(), 101))
Данный вариант достаточно часто встречается. Правда, от него могут быть проблемы в производительности, когда вы будите обрабатывать несколько тысяч строк и более.
Другой вариант, если вы используете SQL Server 2008 – это приводить DATETIME к упомянутому выше типу DATE:
SELECT CAST(GETDATE() AS DATE)
Вы так же можете привести данный тип потом к DATETIME, если вам необходимо оперировать именно с этим типом.
И все же, если вы до сих пор используете SQL Server версии 2005, то лучше способ, чем описанный выше способ с VARCHAR – это приведение к типу FLOAT, вызов FLOOR (целое от числа), а затем приведение обратно к DATETIME:
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
Kevin Jones утверждает, что данные операции пройдут быстрее, аргументируя это тем, что во время приведения к типу VARCHAR и обратно SQL сервер еще задумывается о collation и о форматах. Когда же переводишь тип данных DATETIME к FLOAT, то целая часть числа – хранит информацию о дне, а дробная о времени. Использую функцию FLOAR мы берем только время. Кстати, с таким подходом легко, к примеру, сразу же прибавить день к дате.
Я в отличие от Kevin Jones попробовал все таки провести тест сравнения этих двух методов, правда использовав SQL Server 2008. Я написал следующий тест:
set nocount on go declare @date datetime, @i int declare @test table(d datetime) set @date = getdate() set @i = 0 -- заполняем тестовыми данными (10000001 строка с датами) while @i
Результат выполнения (в окне Messages):
Aug 10 2009 11:36:07
Aug 10 2009 11:37:15
Aug 10 2009 11:38:20
То есть, разница всего то в 3-х секундах (Если поменять местами методы, то разницы вообще не будет). Итог: при еще большем объеме, может быть, это и сыграет роль, но в данном случае выигрыш не заметен. Потому вывод: данный способ (приведения к FLOAT и обратно) нужно взять на заметку и использовать в дальнейшем, но в данный момент не стоит переписывать существующий функционал, так как большого прироста производительности это не даст.
P.S. Может быть, в SQL Server 2000/2005 будут другие результаты? Или, может быть, в реальной жизни выигрыш будет?
UPDATE
Благодаря комментариям Ulugbek Umirov и Евгений Веприков из ветки блогов GotDotNet получены более честные результаты.
Было предложено использовать COUNT, а не чистый вывод в окно Managment Studio:
print convert(varchar(20), getdate(), 109) -- тестируем способ с VARCHAR select count(convert(datetime, convert(varchar(15), d, 101))) from @test print convert(varchar(20), getdate(), 109) -- тестируем способ с FLOAT select count(cast(floor(cast(d as float)) as datetime)) from @test print convert(varchar(20), getdate(), 109)
И тогда результаты будут уже более значимыми:
Aug 11 2009 12:14:30
Aug 11 2009 12:14:38
Aug 11 2009 12:14:41
Разница уже более чем в два раза.
Так же был предложен еще один метод by Ulugbek Umirov:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Данный метод показывает лучше результаты на 2000 сервере, на 2005/2008 почти такой же.
See Also
Found a misprint? Feel free to send a Pull Request or open an issue.
Have a question about the post? You tried, something does not work? GitHub discussions.
Have question or feedback? Email me public@denis.gladkikh.email
The content on this site represents my own personal opinions and thoughts at the time of posting.
Content licensed under the Creative Commons CC BY 4.0.
Source code examples published with MIT License (if not mentioned in the post).