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

голоса
1k
SELECT GETDATE()

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

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

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

Задан 22/09/2008 в 04:31
источник пользователем
На других языках...                            


46 ответов

голоса
1k

На 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
Ответил 22/09/2008 в 04:34
источник пользователем

голоса
652

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

SELECT CONVERT(date, GETDATE())
Ответил 24/09/2008 в 14:02
источник пользователем

голоса
139

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

select cast(getdate() as date)
Ответил 31/01/2011 в 10:44
источник пользователем

голоса
66

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

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

set showplan_text on
GO 

Оба DATEADD и DATEDIFF выполнит CONVERT_IMPLICIT.

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


Конвертируйте (VARCHAR, MyDate, 101) ОТ DatesTable

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

ВЫБОР DATEADD (дд, 0, DATEDIFF (дд, 0, MyDate)) ОТ 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 всплыть и обратно не всегда дает исходное значение.

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

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

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

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

Ответил 22/09/2008 в 09:04
источник пользователем

голоса
40
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
Ответил 22/09/2008 в 04:33
источник пользователем

голоса
33
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Ответил 22/09/2008 в 04:33
источник пользователем

голоса
19

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

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

CAST и CONVERT

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

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
Ответил 22/09/2008 в 04:34
источник пользователем

голоса
17

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

CAST (ДатаРазмещения как дата)

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

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

Для SQL Server 2012 используйте следующий код:

CONVERT(VARCHAR(10), OrderDate , 111)
Ответил 19/12/2013 в 07:48
источник пользователем

голоса
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
Ответил 22/09/2011 в 13:21
источник пользователем

голоса
12

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
Ответил 22/09/2008 в 08:38
источник пользователем

голоса
11

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

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

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

Ответил 26/07/2012 в 21:00
источник пользователем

голоса
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))

Edit: Первые два метода, по существу, то же самое, и превосходя новообращенный к методу VARCHAR.

Ответил 22/09/2008 в 04:35
источник пользователем

голоса
9

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

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

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

FORMAT ( value, format [, culture ] )

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

Вы должны помнить, д (для небольших моделей) и 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" - Long модель дата.

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. Пользовательский формат дата и время Строка
Ответил 24/08/2016 в 07:36
источник пользователем

голоса
8
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
Ответил 12/05/2014 в 15:41
источник пользователем

голоса
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))качестве 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

Ответил 26/03/2014 в 13:39
источник пользователем

голоса
8

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

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

Я holpe полезно.

Ответил 17/11/2013 в 18:36
источник пользователем

голоса
7

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
Ответил 13/05/2016 в 21:00
источник пользователем

голоса
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')
Ответил 13/04/2016 в 10:46
источник пользователем

голоса
6

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

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
Ответил 27/11/2013 в 07:16
источник пользователем

голоса
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
Ответил 27/02/2015 в 21:16
источник пользователем

голоса
5
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
Ответил 19/11/2014 в 20:46
источник пользователем

голоса
4

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

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

Ответил 20/07/2016 в 15:58
источник пользователем

голоса
4

Дата:

Конвертируйте (дата, GETDATE ())
SELECT CAST (GETDATE () в качестве даты)

Время:

Конвертируйте (время, GETDATE (), 114)
SELECT CAST (GETDATE () в качестве времени)
Ответил 21/05/2016 в 09:24
источник пользователем

голоса
4

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

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

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

Ответил 30/04/2015 в 19:00
источник пользователем

голоса
3

В SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
Ответил 24/05/2016 в 09:36
источник пользователем

голоса
3

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

SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
Ответил 21/10/2015 в 04:54
источник пользователем

голоса
3
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
Ответил 01/09/2015 в 13:02
источник пользователем

голоса
3

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

Ответил 08/07/2015 в 06:28
источник пользователем

голоса
3

почему бы вам не использовать 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'части

Ответил 17/05/2014 в 06:46
источник пользователем

голоса
2

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

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

 SELECT CAST(GETDATE() AS DATE)
Ответил 21/10/2017 в 04:02
источник пользователем

голоса
2

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

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
Ответил 08/09/2017 в 05:24
источник пользователем

голоса
2

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

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

Ответил 15/01/2016 в 18:14
источник пользователем

голоса
2

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

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

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

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

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

Ответил 29/03/2014 в 16:22
источник пользователем

голоса
1

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

то вы можете округлить его с помощью

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

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

Ответил 30/07/2019 в 13:32
источник пользователем

голоса
1

При использовании SQL 2008 и выше:SELECT CONVERT(DATE ,GETDATE())

Ответил 09/04/2019 в 09:28
источник пользователем

голоса
1

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

SELECT CONVERT(date, GETDATE()) as date
Ответил 03/10/2018 в 08:21
источник пользователем

голоса
1

Конвертируйте (дата, GETDATE ())

Ответил 03/05/2016 в 07:49
источник пользователем

голоса
1

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

SELECT SYSDATE TODAY FROM DUAL; 
Ответил 29/03/2016 в 22:56
источник пользователем

голоса
0

Проще всего было бы использовать: SELECT DATE(GETDATE())

Ответил 28/05/2019 в 11:34
источник пользователем

голоса
0

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

Для того, чтобы получить результаты, которые вы хотите в этом формате в частности:

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 есть такая избыточность?

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

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

Ответил 23/04/2019 в 20:56
источник пользователем

голоса
0

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

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

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

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

Ответил 30/03/2019 в 11:01
источник пользователем

голоса
0
select cast(createddate as date) as derivedate from table 

createdate ваша колонка даты и времени, это работает для SQLServer

Ответил 24/03/2019 в 20:36
источник пользователем

голоса
0

Мой стиль

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
Ответил 21/11/2018 в 11:39
источник пользователем

голоса
0

Один другой путь :)

SELECT SUBSTRING(CONVERT(nvarchar(10), getdate(), 103) , 0, 11)
Ответил 28/03/2018 в 18:28
источник пользователем

голоса
-1

выберите новообращенный (GETDATE () как daselect CONVERT (DateTime, конвертирование (дата, GETDATE ())) тэ)

Ответил 05/10/2018 в 08:18
источник пользователем

голоса
-5
select Cast (getdate() as Date) yourDate
Ответил 20/06/2017 в 10:22
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more