Как вернуть только дату из типа данных DateTime SQL Server

SELECT GETDATE()

Возвращает: 2008-09-22 15:24:13.790

Я хочу эту часть даты без части времени: 2008-09-22 00:00:00.000

Как я могу это получить?

Если вы хотите получить тип данных даты без времени, даже если время 00:00:00, вам не повезло, вы можете получить varchar, но структура - это datetime, и у вас всегда будет время.

Quintin Robinson 22.09.2008 07:39

Следует отметить, что SQL Server 2008 включает отдельный тип данных DATE для хранения только дат без компонента времени. Подробнее здесь: sql-server-performance.com/articles/dev/datetime_2008_p1.asp‌ x

Ben Hoffstein 22.09.2008 07:44

Не пропустите эта почта, показывающий результаты тестирования производительности различных методов удаления времени.

ErikE 18.08.2012 02:02

@ Мартин странно, спасибо, Давай попробуем еще.

Aaron Bertrand 18.11.2013 01:13

Не вводите себя в заблуждение голосами и принятым ответом, взгляните на stackoverflow.com/a/126984/1155650

Rohit Vipin Mathews 26.11.2013 14:24

@Rohit не у всех есть SQL Server 2008 или новее.

hktegner 13.12.2013 20:44

@hktegner - это должно вводить в заблуждение тех, у кого есть. Также есть одна версия ниже 2008 (то есть: 2005), где, как и после нее, у нас есть 4 и продолжает расти.

Rohit Vipin Mathews 14.12.2013 09:11

@Rohit Вы ошибочно полагаете, что 2008 - единственная версия, которая волнует людей. (Есть и другие версии в дикой природе.) Голоса говорят сами за себя.

hktegner 14.12.2013 22:27

Для будущих читателей: mssqltips.com/sqlservertip/1145/… также полезен для получения правильного формата при использовании convert.

eaglei22 09.12.2019 17:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1 887
9
2 986 067
44
Перейти к ответу Данный вопрос помечен как решенный

Ответы 44

Попробуй это:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

Приведенный выше оператор преобразует ваш текущий формат в YYYY/MM/DD, пожалуйста, обратитесь к эта ссылка, чтобы выбрать предпочтительный формат.

Это возвращает мне "2008/09/22"

eddiegroves 22.09.2008 07:41

SELECT CONVERT (VARCHAR (10), GETDATE (), 101) - это формат mm/dd/yyyy.

Flea 11.07.2013 00:47

если вы сортируете на основе необработанного текстового значения (вне БД), то лучше использовать «японский» формат

Simon_Weaver 14.09.2013 04:34

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Ответ принят как подходящий

На SQL Server 2008 и выше вы должны CONVERT на сегодняшний день:

SELECT CONVERT(date, getdate())

В более старых версиях вы можете сделать следующее:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

Например

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

дает мне

2008-09-22 00:00:00.000

Плюсы:

  • Никаких преобразований varchar <-> datetime не требуется
  • Не нужно думать о locale

По предложению Майкл

Используйте этот вариант: SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

select getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

Выход:

2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000

Является ли этот способ лучше или хуже с точки зрения производительности, чем использование других методов преобразования? Или это ничтожно мало?

eddiegroves 22.09.2008 07:48

Мой метод работает быстрее. Он не требует преобразования в varchar и позволяет эффективно вычислять дату.

aku 22.09.2008 07:54

+1 Похоже, этот на 35% быстрее, чем обычно используемый метод double convert () (который я также использовал в течение многих лет). Хороший.

Dane 22.09.2008 08:04

Если это 35%, чем метод CONVERT, вы должны задаться вопросом, насколько быстрее будет встроенное усечение - это должна быть самая распространенная операция, связанная с датой и временем, которую я когда-либо делал - я собираюсь посмотреть на переключение к этому механизму.

Cade Roux 22.09.2008 08:11

Единственный недостаток вашего решения, который я вижу, заключается в том, что если вы не знаете, что оно делает, оно будет немного тупым. Использование метода двойного преобразования делает ваши намерения более очевидными для всех разработчиков кода. Кстати, я не голосовал против вас. Думаю, я тоже начну пользоваться вашим методом. Спасибо @aku

Jim Birchall 24.09.2008 12:25

+1 Возможно, вам будет интересно увидеть отредактированный ответ Рикардо С. (поскольку это вики сообщества и фактически неверно, я исправил его). У вас также есть поддержка вашего вопроса.

ErikE 13.09.2010 03:15

Также не пропустите эта почта, показывающий результаты тестирования производительности.

ErikE 13.09.2010 04:51

@pilavdzice Установка даты и времени на полночь этого дня делает ОТКЛЮЧИТЕ ВРЕМЯ. Какого результата вы ждете? Тип данных datetime не может иметь совсем нет времени. Я думаю, вы путаете хранение данных с пользовательским представлением. Если все, что вам нужно, это способ показать пользователю строку без временной части (не нулей, только пробелы), тогда вам просто нужен Convert(varchar(30), @Date, 101) или что-то подобное. См. Электронная документация по SQL Server • Приведение и преобразование для получения дополнительной информации.

ErikE 18.08.2012 02:03

Стоит отметить, что это не распространяется на агрегирование данных за месяц или год. Вы должны изменить условия, чтобы это сработало. SELECT DATEADD (mm, DATEDIFF (mm, 0, @YourDate), 0) расширяется для mm / yy iirc

N t 20.05.2013 18:10

@aku Есть ли способ получить только Datepart как «2008-09-22», а не "2008-09-22 00: 00: 00.000" без преобразования в VARCHAR. Сейчас использую CONVERT(VARCHAR(10), @dateTime, 101) AS MyDate

Praveen 15.06.2013 15:13

@ user1671639 тип данных datetime всегда содержит как дату, так и время, вы не можете разумно хранить одно без другого - если вы не используете SQL Server 2008, и в этом случае есть также отдельные данные `` дата '' и `` время '' типы. Если вы используете CONVERT () таким образом, вам действительно нужна строка для дальнейшего использования, поэтому вы застрянете, делая это так, хотя было бы лучше, если бы вы использовали функции форматирования даты вместо того, чтобы вырезать дату - или через CAST(... AS DATE) или CONVERT(DATE, ...), которые довольно часто упоминались именно на этой странице.

Magnus 21.06.2013 19:08

Я рекомендую изменить ответ на SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0), потому что тогда dd можно заменить на любое другое ключевое слово datepart, чтобы обрезать ваш datetime на произвольном уровне.

Michael 14.08.2014 20:08

выберите приведение (createddate as date) из таблицы, где createdate - ваш столбец datetime

karthik kasubha 24.03.2019 20:34

Вы можете использовать функцию CONVERT, чтобы вернуть только дату. См. Ссылку (-ы) ниже:

Манипулирование датой и временем в SQL Server 2000

КАСТ И ПРЕОБРАЗОВАТЬ

Синтаксис использования функции преобразования:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Обновлено: первые два метода по существу одинаковы, и выполнить преобразование в метод varchar.

Все эти методы хороши, но какой из них вы предлагаете использовать?

eddiegroves 22.09.2008 07:48

Обратите внимание, что «правильная» версия двух верхних - select dateadd(dd, datediff(dd, 0, getdate()), 0), потому что dds можно затем заменить на любой из ключевые слова datepart, чтобы вырезать дату в любом выбранном вами сегменте. (Также обратите внимание, что dd - это просто сокращение от day.)

Michael 14.08.2014 20:02

Используя FLOOR () - просто сократите временную часть.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

Этот метод не самый быстрый и неявно учит людей тому, что приведение дат к float является точным, а это не так. Пожалуйста, смотрите эта почта для более подробной информации.

ErikE 13.09.2010 03:16

DATEADD и DATEDIFF лучше, чем преобразование в varchar. Оба запроса имеют один и тот же план выполнения, но планы выполнения в основном относятся к стратегиям доступа данные и не всегда выявляют неявные затраты, связанные с временем ЦП, затрачиваемым на выполнение всех частей. Если оба запроса выполняются для таблицы с миллионами строк, время ЦП с использованием DateDiff может быть близко к 1/3 от времени ЦП Convert!

Чтобы просмотреть планы выполнения запросов:

set showplan_text on
GO 

И DATEADD, и DATEDIFF выполнят CONVERT_IMPLICIT.

Хотя решение CONVERT проще и легче читается для некоторых, оно работает является медленнее. Нет необходимости возвращаться к datetime (это неявно выполняется сервером). Также нет реальной необходимости в методе DateDiff для DateAdd после этого, поскольку целочисленный результат также будет неявно преобразован обратно в datetime.


ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (varchar, MyDate, 101) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

ВЫБЕРИТЕ DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

Использование FLOOR () в качестве предложенного @digi имеет производительность, близкую к DateDiff, но не рекомендуется, поскольку приведение типа данных datetime к float и обратно не всегда дает исходное значение.

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

Будьте осторожны, когда проверяете свои результаты. Выбор большого количества строк для клиента скроет разницу в производительности, поскольку для отправки строк по сети требуется больше времени, чем для выполнения вычислений. Поэтому убедитесь, что работа со всеми строками выполняется сервером, но набор строк не отправляется клиенту.

Некоторые люди, кажется, не понимают, когда оптимизация кеша влияет на запросы. Выполнение двух запросов в одном пакете или в отдельных пакетах не влияет на кеширование. Таким образом, вы можете либо истечь срок действия кеша вручную, либо просто запустить запросы вперед и назад несколько раз. Любая оптимизация для запроса №2 также повлияет на все последующие запросы, поэтому, если хотите, откажитесь от выполнения №1.

Вот полный тестовый сценарий и результаты производительности, который доказывает, что DateDiff значительно быстрее, чем преобразование в varchar.

Рикардо Си, хорошее расследование! Какую версию SQL-сервера вы используете? На MSSQL2000 метод с dateiff работает для меня немного быстрее.

aku 24.09.2008 09:29

Отметим, что я выполнил тест 1000 000 раз. Думаю, для реальных сценариев разница в производительности не будет заметна.

aku 24.09.2008 09:30

Аку, я использовал для этого теста SQL Server 2005 Express. Я работаю над 2000 на работе, и я протестирую его с таблицей с более чем 24 миллионами строк и посмотрю, что из этого получится.

Ricardo C 24.09.2008 10:20

Аку, те же результаты. Никакой разницы в производительности более десяти миллионов строк.

Ricardo C 25.09.2008 07:41

Утверждения о равной производительности не соответствуют действительности. Конечно же, планы выполнения будут такими же !!! Измерение производительности на них ДОЛЖНО выполняться путем сравнения использования ЦП, а не изучения планов выполнения.

ErikE 13.09.2010 03:01

SQLServer 2008 теперь имеет тип данных «дата», который содержит только дату без компонента времени. Любой, кто использует SQLServer 2008 и более поздних версий, может делать следующее:

SELECT CONVERT(date, GETDATE())

В SQL 2008 также есть тип данных «время», который отвечает на вторую половину вопроса о разделении даты и времени.

misteraidan 25.08.2011 04:01

К вашему сведению, я протестировал различные методы отсечения времени от дат, и это был самый быстрый метод. Конечно, разница была небольшая, но она была явно быстрее в большом количестве выполнений.

UnhandledExcepSean 03.07.2014 16:48

мол про sqlserver 2005 ??

Dr. MAF 19.11.2015 12:10

@ Dr.MAF Завершая круг, ответ до 2008 года находится здесь: stackoverflow.com/questions/113045/…

Frosty840 31.07.2017 10:24

При использовании SQL 2008 и выше:

select cast(getdate() as date)

Сообщение 243, уровень 16, состояние 1, строка 1 Дата типа не является определенным системным типом.

Fredrick Gauss 13.12.2012 20:10

@FredrickGauss: Какой тип, Дата? Какую версию SQL Server вы используете?

abatishchev 14.12.2012 00:01

Остерегаться! объявить @ date1 datetime = '2015-09-30 20:59: 59.999'; select cast (@ date1 as date) возвращает '2015-10-01'

Nick 24.09.2015 22:18

@abatishchev извините, это должен был быть declare @date1 datetime = '2015-09-30 23:59:59.999';select cast(@date1 as date)

Nick 24.09.2015 23:51

@Nick: это проблема с DateTime. используйте DateTime2, и он отлично работает. sqlfiddle.com/#!6/9eecb7/2833

abatishchev 25.09.2015 04:33

@Nick, в дополнение к ответу abatishchev, ваш @ date1 действительно 2015-10-01 из-за ограничений DateTime. Попробуй без приведения к Date, даёт 2015-10-01too! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1 => 2015-10-01

Frédéric 11.12.2015 20:07

Один из этих легко запоминающихся приемов SQL. Как говорит Майк, только с 2008 года, но, если вы где-то найдете базу данных 2005 года и предыдущую, у вас может быть много проблем :)

NicVerAZ 29.12.2015 20:04

@NixVerAZ Я считаю, что есть ровно 0 причин для запуска SQL Server 2005 в конце 2016 года. Это чистый идиотизм, не так ли? Хороший признак того, что там что-то ужасно не так.

abatishchev 29.12.2015 21:04

Мне нравится использование ANSI std «CAST ()» - если переносимость в наши дни является проблемой (или даже достижимой) :). Также рекомендуется, если вы хотите сохранить точность: msdn.microsoft.com/en-us/library/ms187928.aspx

galaxis 09.06.2017 21:05

@abatischchev - 1 причина, которая относится к большему количеству экземпляров, чем вы считаете возможным: руководство отказывается утверждать бюджет на обновление антиквариата, пока кому-то удается поддерживать их работу. Даже SQL Server 2000, работающий под Windows 2000, все еще жив. SQL Server 2005 Express: около 50 экземпляров только в моей компании (нет, не в моей, в которой я работаю).

Luc VdV 18.10.2017 10:28

Проблема '2015-09-30 20: 59: 59.999', похоже, больше не относится к Sql Server 2016.

Luc VdV 18.10.2017 10:37

Можно пойти еще дальше со стандартом ANSI, используя SELECT CAST(CURRENT_TIMESTAMP AS DATE) (CURRENT_TIMESTAMP эквивалентен GETDATE()).

David Faber 24.03.2018 15:47

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21

SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011

ЕСЛИ вы хотите использовать CONVERT и получить тот же результат, что и в исходном заданном вопросе, то есть yyyy-mm-dd, тогда используйте CONVERT(varchar(10),[SourceDate as dateTime],121) тот же код, что и предыдущая пара ответов, но код для преобразования в yyyy-mm-dd с тире 121.

Если я смогу залезть на свою мыльницу на секунду, такое форматирование не относится к уровню данных, и вот почему это было невозможно без глупых «трюков» с высокими накладными расходами до появления SQL Server 2008, когда будут представлены фактические типы данных datepart. Выполнение таких преобразований на уровне данных - это огромная трата накладных расходов для вашей СУБД, но, что более важно, как только вы сделаете что-то подобное, вы в основном создадите потерянные данные в памяти, которые, как я полагаю, вы затем вернетесь в программу. Вы не можете вернуть его в другой столбец 3NF + или сравнить его с чем-либо, набранным без возврата, поэтому все, что вы сделали, это добавили точки отказа и удалили реляционную ссылку.

Вы должны ВСЕГДА идти вперед и возвращать свой тип данных dateTime вызывающей программе и на уровне ПРЕЗЕНТАЦИИ внесите необходимые изменения.. Как только вы начнете преобразовывать вещи перед их возвратом вызывающей стороне, вы избавляетесь от всякой надежды на ссылочную целостность из приложения. Это предотвратит операцию UPDATE или DELETE, если вы не выполните какое-либо ручное восстановление, которое снова подвергает ваши данные ошибкам человека / кода / гремлина, когда в этом нет необходимости.

За исключением, скажем, случая, когда вам нужен запрос, который извлекает все записи, соответствующие предоставленному пользователем Дата как часть даты определенного поля времени. Удачи в этом только на уровне представления. (Вам не нужно конвертировать, вы можете использовать арифметику даты, но вы поняли ...)

Andrew Lazarus 14.03.2013 20:42

@ Андрей, какое это имеет значение? Вы говорите WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date); - нет абсолютно никакого смысла вычеркивать время из колонки.

Aaron Bertrand 16.11.2013 09:09

@AaronBertrand Это работает только при условии, что вход @Date имеет нулевую временную часть. Если это не так, вам все равно нужно знать, как сократить время на стороне сервера. Я согласен с этим ответом, что форматирование должно быть оставлено на уровне представления, но я не согласен с тем, что оставление этого для внешнего интерфейса означает, что вам не нужно знать быстрый способ усечения.

Andrew Lazarus 16.11.2013 21:04

@Andrew все, что вам нужно сделать, это сделать входной параметр DATE. Я по-прежнему считаю, что вам никогда не следует применять такое усечение к столбец, даже если это первый инстинкт большинства людей.

Aaron Bertrand 17.11.2013 00:25

@AaronBertrand и который предполагают, что у вас есть контроль над типом данных параметра. Прекрасно в хранимой процедуре, но не в других ситуациях. Почему бы не выполнить приведение, чтобы убедиться, что параметр является нужным вам типом?

Andrew Lazarus 19.11.2013 03:42

@ Андрей снова, все в порядке. Моя точка зрения - ОПЯТЬ ТАКИ - заключается в том, что вам никогда не нужно разыгрывать колонка. Пожалуйста прочти.

Aaron Bertrand 19.11.2013 03:56

Чтобы получить указанный результат, я использую следующую команду.

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

Я надеюсь, это полезно.

Я думаю, это сработает в вашем случае:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25

Для возврата в формате даты

CAST(OrderDate AS date)

Приведенный выше код будет работать в sql server 2010.

Он вернется, как 12/12/2013

Для SQL Server 2012 используйте приведенный ниже код

CONVERT(VARCHAR(10), OrderDate , 111)

Это возвращает мне дату с нулевым временем, а не только дату

Bohemian 05.01.2014 17:09

могу ли я узнать, какую версию SQL-сервера вы используете?

Mahesh ML 19.03.2014 11:15

@MaheshML возвращает дату и время в MS SQL 2012.

Marek 13.04.2014 19:50

Прекрасно работает в SQL Azure

Martín Coll 21.05.2014 19:01

@MaheshML SQL Server 2010 не существует.

SvenAelterman 25.09.2017 05:22

Я ожидаю, что «SQL Server 2010» означает SQL Server 2008 R2 (в 2010 году было вышел)

J. Chris Compton 05.06.2019 23:19

Если вам нужен результат в виде varchar, вам следует пройти через

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

о котором уже упоминалось выше.

Если вам нужен результат в формате даты и времени, вы должны использовать любой из запросов ниже

  1. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 
    

    2014-03-26 00:00:00.000

  2. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate 
    

    2014-03-26 00:00:00.000

  3. DECLARE  @OnlyDate DATETIME
    SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
    SELECT @OnlyDate AS OnlyDate
    

    2014-03-26 00:00:00.000

Вы можете использовать следующее для части даты и форматирования даты:

DATENAME => Возвращает символьную строку, которая представляет указанную часть указанной даты.

DATEADD => Функция DATEPART() используется для возврата одной части даты / времени, такой как год, месяц, день, час, минута и т. д.

DATEPART => Возвращает целое число, представляющее указанную часть указанной даты.

CONVERT() => Функция CONVERT() - это общая функция, которая преобразует выражение одного типа данных в другой. В Функция CONVERT() может использоваться для отображения данных даты / времени в различных форматах.

 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

почему бы вам не использовать DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?

EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

вы можете изменить последовательность m, d и года, переставив часть '%d-%m-%Y'

DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

Это предложение было затронуто другими ответами (более одного раза).

Andriy M 20.11.2014 00:47

Даже при использовании старого MSSQL Server 7.0 код здесь (любезно предоставленный этим связь) позволил мне получить любой формат даты, который я искал в то время:

PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)

Он произвел такой вывод:

1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630

Я предпочитаю следующее, о чем не упоминалось:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

Он также не заботится о локальном или двойном преобразовании - хотя каждая 'datepart', вероятно, выполняет математические вычисления. Так что он может быть немного медленнее, чем метод dateiff, но для меня он намного понятнее. Особенно, когда я хочу сгруппировать только по году и месяцу (установите день на 1).

Дата (поле даты и времени) и DATE_FORMAT (дата и время, "% Y-% m-% d") оба возвращают только свидание от даты и времени

В вопросе говорится о SQL Server. Это похоже на MySQL?

The1nk 17.12.2015 21:31

SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'

Я знаю, что это устарело, но я не вижу, чтобы кто-то так это сказал. Насколько я могу судить, это стандарт ANSI.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Было бы хорошо, если бы Microsoft могла также поддерживать стандартную переменную CURRENT_DATE ANSI.

select {fn current_date()} as today у меня работает.

brianary 02.12.2019 21:26

@brianary - Это хорошо, но это не ANSI SQL.

lit 08.12.2019 20:28

Это достаточно справедливо, и ваш ответ хорошо переносится, но я полагал, что пока мы работаем с T-SQL, это тоже работает (и показывает, что реализация ANSI CURRENT_DATE была бы тривиальной для MS).

brianary 08.12.2019 21:28

Вы можете просто использовать приведенный ниже код, чтобы получить только часть даты и избежать части времени в SQL:

SELECT SYSDATE TODAY FROM DUAL; 

Это не только для Oracle, а не для MS SQL - это даже неправильно. Чтобы получить часть даты только от Oracle, можно использовать TRUNC(SYSDATE)

David Faber 24.03.2018 15:48

Хорошо, хотя я немного опоздал :) Вот еще одно решение.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

Результат

2008-09-22 00:00:00.000

И если вы используете SQL Server 2012 и выше, вы можете использовать функцию FORMAT() следующим образом:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')

В вашем первом примере все еще есть компонент времени. Вопрос был в том, как это убрать.

Zack 21.04.2016 00:20

Если вы назначаете результаты столбцу или переменной, присвойте ему тип DATE, и преобразование будет неявным.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

Дата:

SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)

Время:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)

На SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)

Начиная с SQL SERVER 2012, вы можете сделать это:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

Если вы используете SQL Server 2012 или более поздние версии,

Используйте функцию Format().

Уже есть несколько ответов и типов форматирования для SQL-сервера. Но большинство методов несколько неоднозначны, и вам будет сложно запомнить числа для типа формата или функций в отношении конкретного формата даты. Поэтому в следующих версиях SQL-сервера есть вариант получше.

FORMAT ( value, format [, culture ] )

Опция культуры очень полезна, так как вы можете указать дату в соответствии с вашими зрителями.

Вы должны помнить d (для маленьких паттернов) и D (для длинных паттернов).

1. "d" - шаблон короткой даты.

2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)

2. «D» - шаблон длинной даты.

2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)

Больше примеров в запросе.

DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
----------------  ----------------------------- ------------- -------------------------------------
10/1/2011         01/10/2011                    01.10.2011    2011/10/1

US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
---------------------------- ----------------------------- -----------------------------  ---------------------------------------
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011年10月1日

Если вам нужно больше форматов, вы можете перейти по ссылке:

  1. Строки стандартных форматов даты и времени
  2. Строки настраиваемого формата даты и времени

Чтобы пропустить культуру, пользовательские форматы позволяют вам установить свои собственные, например FORMAT (@d, 'yyyyy-MM-dd'), чтобы получить 2011-10-11.

ourmandave 07.01.2021 16:43

Просто вы можете сделать так:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Выводится как:

2008-09-22 00:00:00.000

Или просто сделайте так:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

Результат:

Date Part Only
--------------
2013-07-14

Мой общий подход, чтобы получить дату без временной части ..

 SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)

 SELECT CAST(GETDATE() AS DATE)

select convert(getdate() as date)

select CONVERT(datetime,CONVERT(date, getdate()))

Я думаю, вы скопировали 2 оператора выбора, но скопировали второй выбор внутри первого выбора.

ChrisM 29.07.2019 15:53

Мой стиль

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))

select cast(createddate as date) as derivedate from table 

createdate - это ваш столбец datetime, это работает для sqlserver

вы можете использовать, как показано ниже, для разных типов вывода только для даты

  1. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103)) ----- дд / мм / гггг

  2. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)) ------ мм / дд / гггг

  3. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))

Вау, позволь мне посчитать, как ты можешь это сделать. (не каламбур)

Чтобы получить желаемые результаты именно в этом формате:

2008-09-22

Вот несколько вариантов.

SELECT CAST(GETDATE() AS DATE) AS 'Date1'
SELECT Date2  = CONVERT(DATE, GETDATE())
SELECT CONVERT(DATE, GETDATE()) AS 'Date3'
SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'
SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'
SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'

Итак, я бы посоветовал выбрать тот, который вам удобен, и использовать этот метод повсеместно во всех ваших таблицах.

Все эти параметры возвращают дату в одном и том же формате. Почему у SQL Server такая избыточность?

Понятия не имею, но они знают. Может быть, кто-нибудь умнее меня ответит на этот вопрос.

Надеюсь, это кому-то поможет.

Самый простой способ - использовать: SELECT DATE(GETDATE())

DATE - не функциональный чувак.

noobprogrammer 06.01.2020 12:39

Если вы хотите, чтобы дата показывала 2008-09-22 00:00:00.000

тогда вы можете округлить его, используя

SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))

Это покажет дату в формате в вопросе

В этом случае, только по дате, мы запустим этот запрос:

ВЫБРАТЬ ПРЕОБРАЗОВАТЬ (VARCHAR (10), getdate (), 111);

Просто делать:

SELECT CAST(date_variable AS date)

или с PostgreSQL:

SELECT date_variable::date

Поскольку с момента получения ответов на этот вопрос было внесено много изменений, я хотел предоставить новый способ получить запрошенный результат. Есть два способа проанализировать данные DATETIME. Во-первых, чтобы получить дату, как задается в этом вопросе:

DATEVALUE([TableColumnName])

Во-вторых, чтобы получить время из значения:

TIMEVALUE([TableColumnName])

Пример:

Таблица: Клиенты

Столбец: CreationDate как DateTime

[Покупатели]. [Дата создания]: 07.02.2020, 09:50:00

DATEVALUE([Customers].[CreationDate]) '--> Output: 2/7/2020
TIMEVALUE([Customers].[CreationDate]) '--> Output: 09:50:00

Я надеюсь, что это поможет, поскольку я какое-то время искал и нашел много ответов, как видно из этого вопроса, и ни один из них не сработал. IE CAST и CONVERT.

Удачного кодирования!

Синтаксис:

SELECT CONVERT (data_type(length)),Date, DateFormatCode)

Бывший:

Select CONVERT(varchar,GETDATE(),1) as [MM/DD/YY]
Select CONVERT(varchar,GETDATE(),2) as [YY.MM.DD]

все коды формата даты о дате:

DateFormatCode  Format
1       [MM/DD/YY]
2       [YY.MM.DD]
3       [DD/MM/YY]
4       [DD.MM.YY]
5       [DD-MM-YY]
6       [DD MMM YY]
7       [MMM DD,YY]
10      [MM-DD-YY]
11      [YY/MM/DD]
12      [YYMMDD]
23      [yyyy-mm-dd]
101     [MM/DD/YYYY]
102     [YYYY.MM.DD]
103     [DD/MM/YYYY]
104     [DD/MM/YYYY]
105     [DD/MM/YYYY]
106     [DD MMM YYYY]
107     [MMM DD,YYYY]
110     [MM-DD-YYYY]
111     [YYYY/MM/DD]
112     [YYYYMMDD]

Другие вопросы по теме