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

SELECT GETDATE()

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

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

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

+1623
22 сент. '08 в 3:31
источник поделиться
30 ответа
  • 1
  • 2

На 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, 0, DATEDIFF(dd, 0, getdate()))

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
+2326
22 сент. '08 в 3:34
источник

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

SELECT CONVERT(date, GETDATE())
+697
24 сент. '08 в 13:02
источник

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

select cast(getdate() as date)
+158
31 янв. '11 в 9:44
источник

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

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

set showplan_text on
GO 

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

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

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

+70
22 сент. '08 в 8:04
источник

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

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

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

+46
22 сент. '08 в 3:33
источник
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
+38
22 сент. '08 в 3:33
источник

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

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

CAST и CONVERT

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

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
+20
22 сент. '08 в 3:34
источник

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

CAST (дата OrderDate AS)

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

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

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

CONVERT(VARCHAR(10), OrderDate , 111)
+19
19 дек. '13 в 6:48
источник
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
+13
22 сент. '11 в 12:21
источник

Если вы используете 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日

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

+12
24 авг. '16 в 7:36
источник

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
+12
22 сент. '08 в 7:38
источник

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

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

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

+11
26 июл. '12 в 20:00
источник

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

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

Я хочу, чтобы это было полезно.

+10
17 нояб. '13 в 17:36
источник
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.

+10
22 сент. '08 в 3:35
источник

Если вам нужен результат в типе 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

+10
26 мар. '14 в 12:39
источник
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
+8
12 мая '14 в 14:41
источник

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
+7
13 мая '16 в 21:00
источник

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

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
+6
27 нояб. '13 в 6:16
источник

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

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')
+6
13 апр. '16 в 10:46
источник

Даже используя древний 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
+5
27 февр. '15 в 21:16
источник
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
+5
19 нояб. '14 в 20:46
источник

Дата:

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

Время:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)
+5
21 мая '16 в 9:24
источник

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

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

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

+4
30 апр. '15 в 19:00
источник

В SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
+4
24 мая '16 в 9:36
источник

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

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
+4
08 сент. '17 в 5:24
источник

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

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

+4
20 июл. '16 в 15:58
источник

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

+3
17 мая '14 в 5:46
источник

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

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

+3
15 янв. '16 в 18:14
источник

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

SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
+3
21 окт. '15 в 4:54
источник
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
+2
01 сент. '15 в 13:02
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос