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

 SELECT GETDATE()
 

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

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

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

вопрос задан 22.09.2008
eddiegroves
13291 репутация

36 ответов


  • 2113 рейтинг

    На 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
    ответ дан aku, с репутацией 96429, 22.09.2008
  • 663 рейтинг

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

     SELECT CONVERT(date, GETDATE())
     
    ответ дан BenR, с репутацией 8501, 24.09.2008
  • 144 рейтинг

    Если вы используете SQL 2008 и выше:

     select cast(getdate() as date)
     
    ответ дан abatishchev, с репутацией 67868, 31.01.2011
  • 68 рейтинг

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

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

     set showplan_text on
    GO 
     

    И DATEADD, и DATEDIFF будут выполнять CONVERT_IMPLICIT.

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


    SELECT CONVERT (varchar, MyDate, 101) FROM DatesTable

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

    SELECT 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 и back не всегда дает исходное значение.

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

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

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

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

    ответ дан Ricardo C, с репутацией 1788, 22.09.2008
  • 41 рейтинг

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

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

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

    ответ дан Nescio, с репутацией 22075, 22.09.2008
  • 35 рейтинг
    SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
    
    ответ дан Cade Roux, с репутацией 71870, 22.09.2008
  • 18 рейтинг

    Формат возврата в формате даты

    CAST (дата OrderDate AS)

    Вышеприведенный код будет работать в SQL Server 2010

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

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

     CONVERT(VARCHAR(10), OrderDate , 111)
     
    ответ дан Mahesh ML, с репутацией 319, 19.12.2013
  • 18 рейтинг

    Вы можете использовать функцию CONVERT для возврата только даты. См. Ссылки ниже:

    Манипуляция даты и времени в SQL Server 2000

    CAST и CONVERT

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

     CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
     
    ответ дан DaveK, с репутацией 3511, 22.09.2008
  • 12 рейтинг
    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
    
    ответ дан Rushda, с репутацией 129, 22.09.2011
  • 12 рейтинг

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

     SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
     
    ответ дан DiGi, с репутацией 2283, 22.09.2008
  • 11 рейтинг

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

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

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

    ответ дан Focusyn, с репутацией 111, 26.07.2012
  • 10 рейтинг
     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.

    ответ дан Gordon Bell, с репутацией 10557, 22.09.2008
  • 9 рейтинг

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

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

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

     FORMAT ( value, format [, culture ] )
     

    Вариант 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. Пользовательские строки даты и времени
    ответ дан Somnath Muluk, с репутацией 31855, 24.08.2016
  • 9 рейтинг

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

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

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

    ответ дан Anderson Silva, с репутацией 304, 17.11.2013
  • 8 рейтинг
     Convert(nvarchar(10), getdate(), 101) --->  5/12/14
    
     Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
    
    ответ дан Ankit Khetan, с репутацией 108, 12.05.2014
  • 8 рейтинг

    Если вам нужен результат в виде данных 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)) как 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

    ответ дан Stephon Johns, с репутацией 81, 26.03.2014
  • 7 рейтинг

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

     DECLARE @Date DATE = GETDATE()   
    
    SELECT @Date   --> 2017-05-03
     
    ответ дан Art Schmidt, с репутацией 91, 13.05.2016
  • 6 рейтинг

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

     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')
     
    ответ дан Krishnraj Rana, с репутацией 5121, 13.04.2016
  • 6 рейтинг

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

     CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
    //here date is obtained as 1990/09/25
     
    ответ дан bishnu karki, с репутацией 79, 27.11.2013
  • 5 рейтинг

    Даже используя древний 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
     
    ответ дан Matt O'Brien, с репутацией 4060, 27.02.2015
  • 5 рейтинг
    DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
    SELECT CONVERT(DATE, @yourdate)
    
    ответ дан etni, с репутацией 51, 19.11.2014
  • 4 рейтинг

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

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

    ответ дан xbb, с репутацией 1387, 20.07.2016
  • 4 рейтинг

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

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

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

    ответ дан Gerard ONeill, с репутацией 2236, 30.04.2015
  • 4 рейтинг

    На SQL Server 2000

     CAST(
    (
        STR( YEAR( GETDATE() ) ) + '/' +
        STR( MONTH( GETDATE() ) ) + '/' +
        STR( DAY( GETDATE() ) )
    )
    AS DATETIME)
     
    ответ дан kaub0st3r, с репутацией 159, 24.05.2016
  • 4 рейтинг

    Дата:

    SELECT CONVERT (дата, GETDATE ())
    SELECT CAST (GETDATE () в качестве даты)
    

    Время:

    SELECT CONVERT (время, GETDATE (), 114)
    ВЫБРАТЬ КАСТ (GETDATE () как время)
    
    ответ дан Kris Khairallah, с репутацией 1051, 21.05.2016
  • 3 рейтинг

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

     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
     
    ответ дан Amar Srivastava, с репутацией 100, 8.09.2017
  • 3 рейтинг

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

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

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

    ответ дан Janaka R Rajapaksha, с репутацией 1908, 17.05.2014
  • 3 рейтинг

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

     SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
     
    ответ дан Random_Dev, с репутацией 4026, 21.10.2015
  • 2 рейтинг

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

    ответ дан Surekha, с репутацией 62, 8.07.2015
  • 2 рейтинг
    SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
    
    ответ дан Binitta Mary, с репутацией 85, 1.09.2015
  • 2 рейтинг

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

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

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

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

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

    ответ дан user1151326, с репутацией 21, 29.03.2014
  • 2 рейтинг

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

     SELECT CAST(CURRENT_TIMESTAMP AS DATE)
     

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

    ответ дан lit, с репутацией 4890, 15.01.2016
  • 0 рейтинг

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

     SELECT SYSDATE TODAY FROM DUAL; 
     
    ответ дан Shyam Bhimani, с репутацией 840, 29.03.2016
  • 0 рейтинг

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

      SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)
    
     SELECT CAST(GETDATE() AS DATE)
     
    ответ дан Spider, с репутацией 309, 21.10.2017
  • -1 рейтинг

    SELECT CONVERT (дата, getdate ())

    ответ дан Shiraj Momin, с репутацией 337, 3.05.2016
  • -6 рейтинг
    select Cast (getdate() as Date) yourDate
    
    ответ дан Abdul Samad, с репутацией 12, 20.06.2017