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

avatar
eddiegroves
22 сентября 2008 в 03:31
3098806
44
1948
SELECT GETDATE()

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

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

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

Источник
Ben Hoffstein
22 сентября 2008 в 03:44
18

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

ErikE
17 августа 2012 в 22:02
7

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

Aaron Bertrand
17 ноября 2013 в 21:13
2

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

Rohit Vipin Mathews
26 ноября 2013 в 10:24
19

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

hktegner
13 декабря 2013 в 16:44
2

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

Rohit Vipin Mathews
14 декабря 2013 в 05:11
1

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

hktegner
14 декабря 2013 в 18:27
8

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

eaglei22
9 декабря 2019 в 14:31
1

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

ترمیناتور
3 августа 2021 в 15:30
0

ВЫБЕРИТЕ ДОБАВЛЕНИЕ ДАТЫ (дд, 0, РАЗНДАТ (дд, 0, @ваша_дата))

Ответы (44)

avatar
aku
22 сентября 2008 в 03:34
2676

На 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 сентября 2008 в 03:48
0

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

aku
22 сентября 2008 в 03:54
1

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

Dane
22 сентября 2008 в 04:04
57

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

Cade Roux
22 сентября 2008 в 04:11
1

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

Jim Birchall
24 сентября 2008 в 08:25
8

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

ErikE
12 сентября 2010 в 23:15
0

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

ErikE
13 сентября 2010 в 00:51
2

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

ErikE
17 августа 2012 в 22:03
40

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

N t
20 мая 2013 в 14:10
1

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

Praveen
15 июня 2013 в 11:13
1

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

Magnus
21 июня 2013 в 15:08
7

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

Michael
14 августа 2014 в 16:08
10

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

karthik kasubha
24 марта 2019 в 17:34
1

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

avatar
yusuf hayırsever
9 марта 2021 в 12:28
3

Синтаксис:

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]
avatar
Christopher Warrington
7 февраля 2020 в 16:52
0

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

DATEVALUE([TableColumnName])

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

TIMEVALUE([TableColumnName])

Пример:

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

Столбец: CreationDate as DateTime

[Клиенты].[Дата создания]: 07.02.2020 09:50:00

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

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

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

avatar
John Sonnino
15 января 2020 в 10:08
5

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

SELECT CAST(date_variable AS date)

или с PostgreSQL:

SELECT date_variable::date

avatar
Mohammad Neamul Islam
24 ноября 2019 в 08:00
7

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

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

avatar
ChrisM
30 июля 2019 в 10:32
2

Если вы хотите, чтобы отображалась дата 2008-09-22 00:00:00.000

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

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

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

avatar
Jithin Joy
28 мая 2019 в 08:34
-2

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

noobprogrammer
6 января 2020 в 09:39
1

ДАТА - это не функция, чувак.

Nosajimiki
16 июля 2021 в 16:53
0

Чтобы уточнить... DATE() - это функция в mySQL, но этот вопрос касается SQL Server. В mySQL вы можете использовать функцию DATE() для извлечения даты из элемента даты и времени таким образом, что DATE("2021-06-15 09:34:21") возвращает "2021-06-15", но GETDATE() не функция mySQL, поэтому он смешивает языки SQL. Эквивалентом этого в mySQL будет DATE(NOW())... но mySQL делает это совершенно ненужным, поскольку вместо этого вы можете просто вызвать CURDATE().

avatar
Aubrey Love
23 апреля 2019 в 17:56
1

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

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

22 сентября 2008 г.

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

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

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

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

Nosajimiki
16 июля 2021 в 17:18
0

Последние 3 — это полные штампы даты и времени, которые усекаются. 121 не разделен буквой «Т», в то время как два других разделены. 127 является более точным при работе с форматами DATETIME2, но с обычными датами и временем они округляются до тех же значений; поэтому в другом контексте они возвращают 3 разных значения даты и времени. Что касается второго, то A = B можно использовать немного иначе, чем A AS B, используя другие функции, кроме этой, но при использовании этих функций они работают одинаково. Что касается Convert vs Cast, Cast — это встроенная функция ANSI, а Convert — специфичная для SQL. Convert имеет больше возможностей, но не всегда так эффективен.

avatar
ankit soni
30 марта 2019 в 11:01
1

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

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

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

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

avatar
karthik kasubha
24 марта 2019 в 17:36
1
select cast(createddate as date) as derivedate from table 

createdate — это ваш столбец даты и времени, это работает для sqlserver

avatar
CAGDAS AYDIN
21 ноября 2018 в 11:39
1

Мой стиль

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
avatar
mokh223
5 октября 2018 в 08:18
-1
select convert(getdate() as date)

select CONVERT(datetime,CONVERT(date, getdate()))
ChrisM
29 июля 2019 в 12:53
0

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

Aubrey Love
29 сентября 2021 в 15:24
0

Только мои 2 цента стоят, но первый оператор SELECT: «выбрать конвертировать (получить дату () как дату)» не работает. «Дата» и «getdate()» должны были быть инвертированы, как в коде ниже. «SELECT CONVERT(DATE, GETDATE() )» Вы также можете использовать функцию «CAST()». Любой из них вернет те же результаты. «ВЫБЕРИТЕ ПРИВОД (ПОЛУЧИТЕ ДАТУ () КАК ДАТУ)»

avatar
Spider
21 октября 2017 в 04:02
2

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

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

 SELECT CAST(GETDATE() AS DATE)
avatar
Amar Srivastava
8 сентября 2017 в 05:24
5

Вы можете сделать это просто так:

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
avatar
Ricardo C
23 мая 2017 в 12:34
79

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.

aku
24 сентября 2008 в 05:29
0

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

aku
24 сентября 2008 в 05:30
0

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

Ricardo C
24 сентября 2008 в 06:20
0

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

Ricardo C
25 сентября 2008 в 03:41
0

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

ErikE
12 сентября 2010 в 23:01
5

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

avatar
Somnath Muluk
24 августа 2016 в 07:36
18

Если вы используете 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. Строки настраиваемого формата даты и времени
ourmandave
7 января 2021 в 13:43
0

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

avatar
xbb
20 июля 2016 в 15:58
4

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

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

avatar
r-magalhaes
24 мая 2016 в 09:36
4

В SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
avatar
Kris Khairallah
21 мая 2016 в 09:24
6

Дата:

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

Время:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)
avatar
Art Schmidt
13 мая 2016 в 21:00
8

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
avatar
Krishnraj Rana
13 апреля 2016 в 10:46
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')
Zack
20 апреля 2016 в 21:20
0

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

avatar
Shyam Bhimani
29 марта 2016 в 22:56
-1

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

SELECT SYSDATE TODAY FROM DUAL; 
David Faber
24 марта 2018 в 12:48
0

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

avatar
lit
15 января 2016 в 18:14
4

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

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

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

brianary
2 декабря 2019 в 18:26
0

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

lit
8 декабря 2019 в 17:28
0

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

brianary
8 декабря 2019 в 18:28
0

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

avatar
Binitta Mary
1 сентября 2015 в 13:02
3
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
avatar
Surekha
8 июля 2015 в 06:28
3

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

The1nk
17 декабря 2015 в 18:31
1

В вопросе указано SQL Server. Это похоже на MySQL?

avatar
Gerard ONeill
30 апреля 2015 в 19:00
4

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

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

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

avatar
tumultous_rooster
27 февраля 2015 в 21: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
avatar
etni
19 ноября 2014 в 20:46
6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
Andriy M
19 ноября 2014 в 21:47
2

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

avatar
Janaka R Rajapaksha
17 мая 2014 в 05:46
4

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

Пример: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

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

avatar
Ankit Khetan
12 мая 2014 в 14:41
8
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
avatar
user1151326
29 марта 2014 в 15:22
3

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

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

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

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

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

avatar
Stephon Johns
26 марта 2014 в 12:39
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

avatar
Mahesh ML
19 декабря 2013 в 06:48
24

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

CAST (Дата заказа как дата)

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

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

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

CONVERT(VARCHAR(10), OrderDate , 111)
Bohemian♦
5 января 2014 в 13:09
1

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

Mahesh ML
19 марта 2014 в 07:15
1

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

Marek
13 апреля 2014 в 15:50
1

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

Martín Coll
21 мая 2014 в 15:01
1

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

SvenAelterman
25 сентября 2017 в 02:22
5

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

avatar
bishnu karki
27 ноября 2013 в 06:16
6

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

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
avatar
Anderson Silva
17 ноября 2013 в 17:36
11

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

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

Надеюсь, это пригодится.

avatar
Focusyn
26 июля 2012 в 20:00
13

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

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

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

Andrew Lazarus
14 марта 2013 в 16:42
1

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

Aaron Bertrand
16 ноября 2013 в 05:09
1

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

Andrew Lazarus
16 ноября 2013 в 17:04
1

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

Aaron Bertrand
16 ноября 2013 в 20:25
1

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

Andrew Lazarus
18 ноября 2013 в 23:42
1

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

avatar
Rushda
22 сентября 2011 в 12:21
16
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
avatar
abatishchev
31 января 2011 в 09:44
184

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

select cast(getdate() as date)
Fredrick Gauss
13 декабря 2012 в 16:10
0

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

abatishchev
13 декабря 2012 в 20:01
3

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

Nick
24 сентября 2015 в 19:18
8

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

Nick
24 сентября 2015 в 20:51
0

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

abatishchev
25 сентября 2015 в 01:33
6

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

Frédéric
11 декабря 2015 в 17:07
8

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

NicVerAZ
29 декабря 2015 в 17:04
4

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

abatishchev
29 декабря 2015 в 18:04
1

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

galaxis
9 июня 2017 в 18:05
0

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

Luc VdV
18 октября 2017 в 07:28
0

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

Luc VdV
18 октября 2017 в 07:37
0

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

David Faber
24 марта 2018 в 12:47
2

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

avatar
BenR
24 сентября 2008 в 13:02
745

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

SELECT CONVERT(date, GETDATE())
misteraidan
25 августа 2011 в 00:01
44

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

UnhandledExcepSean
3 июля 2014 в 12:48
8

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

Dr. MAF
19 ноября 2015 в 09:10
2

мол про sqlserver 2005 ??

Frosty840
31 июля 2017 в 07:24
0

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

avatar
DiGi
22 сентября 2008 в 07:38
15

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

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
ErikE
12 сентября 2010 в 23:16
4

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

avatar
Gordon Bell
22 сентября 2008 в 03:35
11
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 сентября 2008 в 03:48
1

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

Michael
14 августа 2014 в 16:02
3

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

avatar
DaveK
22 сентября 2008 в 03:34
23

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

Обработка даты и времени в SQL Server 2000

ПРИМЕНЕНИЕ и ПРЕОБРАЗОВАНИЕ

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

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
avatar
Cade Roux
22 сентября 2008 в 03:33
42
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
avatar
Nescio
22 сентября 2008 в 03:33
55

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

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

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

eddiegroves
22 сентября 2008 в 03:41
5

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

Flea
10 июля 2013 в 20:47
1

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

Simon_Weaver
14 сентября 2013 в 00:34
4

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