30 ответов:
On
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плюсы:
- нет
varchardatetimeпреобразования не требуется- не нужно думать о
locale
SQLServer 2008 теперь имеет тип данных "дата", который содержит только дату без компонента времени. Любой пользователь, использующий SQLServer 2008 и выше, может сделать следующее:
SELECT CONVERT(date, GETDATE())
DATEADD и DATEDIFF лучше, чем преобразование в varchar. Оба запроса имеют один и тот же план выполнения, но планы выполнения в основном о сведения стратегии доступа и не всегда показывают неявные затраты, связанные с процессорным временем, затраченным на выполнение всех частей. Если оба запроса выполняются для таблицы с миллионами строк, время процессора с помощью DateDiff может быть близко к 1/3 от времени преобразования процессора!
посмотреть планы выполнения запросы:
set showplan_text on GOи DATEADD и DATEDIFF будут выполнять CONVERT_IMPLICIT.
хотя преобразование решение проще и легче читать для некоторых, это и медленнее. Нет необходимости возвращаться к 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(dd, 0, DATEDIFF (dd, 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 () as @ digi suggested имеет производительность ближе к DateDiff, но не рекомендуется, поскольку приведение типа данных datetime к float и обратно не всегда дает исходное значение.
помните, ребята: не верьте никому. Посмотрите на статистику производительности и протестируйте ее ты сам!
будьте осторожны, когда вы проверяете свои результаты. Выбор нескольких строк для клиента скроет разницу в производительности, потому что для отправки строк по сети требуется больше времени, чем для выполнения вычислений. Поэтому убедитесь, что работа для всех строк выполняется сервером, но нет набора строк, отправленного клиенту.
там, кажется, путаница для некоторых людей о том, когда оптимизация кэша влияет на запросы. Выполнение двух запросов в одном пакете или в отдельных пакетах не влияет на кэширование. Так что вы можете очистить кэш вручную, или просто выполнять запросы и обратно несколько раз. Любая оптимизация для запроса #2 также повлияет на любые последующие запросы, поэтому выбросьте выполнение #1, Если хотите.
здесь полный тестовый сценарий и результаты производительности это доказывает, что DateDiff существенно быстрее, чем преобразование в varchar.
попробуйте это:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)приведенный выше оператор преобразует ваш текущий формат в
YYYY/MM/DD, пожалуйста, обратитесь к этой ссылке, чтобы выбрать предпочтительный формат.
для возврата в формате даты
CAST(OrderDate как дата)
приведенный выше код будет работать в sql server 2010
Он вернется, как 12/12/2013
для SQL Server 2012 используйте следующий код
CONVERT(VARCHAR(10), OrderDate , 111)
можно использовать
CONVERTфункция возвращает только дату. Смотрите ссылку(ы) ниже:манипуляции с датой и временем в SQL Server 2000
синтаксис для использования функции convert:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
С помощью FLOOR () - просто вырезать часть времени.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
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)тот же код, что и предыдущие пару ответов, но код для преобразования в гггг-ММ-ДД с тире составляет 121.Если я смогу залезть на свою мыльницу на секунду,этот вид форматирования не относится к уровню данных, и именно поэтому это было невозможно без глупых "трюков" с высокими накладными расходами до SQL Server 2008, когда фактическая datepart вводятся типы данных. Выполнение таких преобразований на уровне данных-это огромная трата накладных расходов на вашу СУБД, но что еще более важно, во-вторых, вы делаете что-то подобное, вы в основном создали в памяти потерянные данные, которые, как я предполагаю, вы затем вернетесь в программу. Вы не можете вернуть его обратно в другой столбец 3NF+ или сравнить его с чем-либо набранным без возврата, поэтому все, что вы сделали, это ввели точки отказа и удалили реляционную ссылку.
вы всегда должны идти вперед и верните свой тип данных dateTime в вызывающую программу и на уровне представления внесите необходимые изменения. как только вы переходите к преобразованию вещей, прежде чем возвращать их вызывающему, вы удаляете всю надежду на ссылочную целостность из приложения. Это предотвратит операцию обновления или удаления, опять же, если вы не сделаете какую-то ручную реверсию, которая снова подвергает ваши данные ошибке human / code/gremlin, когда нет необходимость.
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: первые два метода по существу одинаковы, и out выполняет преобразование в метод varchar.
чтобы получить указанный результат, я использую следующую команду.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))Я holpe это полезно.
если вы используете SQL Server 2012 или выше версии,
использовать
Format().уже есть несколько ответов и типов форматирования для SQL server. Но большинство методов несколько неоднозначны, и вам будет трудно запомнить числа для типа формата или функций по отношению к определенному формату даты. Вот почему в следующих версиях SQL server лучше выбор.
FORMAT ( value, format [, culture ] )опция культуры очень полезна, так как вы можете указать дату в соответствии с вашими зрителями.
вы должны помнить d (для небольших шаблонов) и D (для длинных шаблонов).
1."д" - короткий шаблон даты.
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."Д" - длинный формат даты.
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日если вы хотите больше форматов, вы можете пойти в:
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14 Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
Если вам нужен результат в тип данных 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.0002)
SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112))как OnlyDate --2014-03-26 00:00:00.0003)
DECLARE @OnlyDate DATETIME SET @OnlyDate = DATEDIFF(DD, 0, GETDATE()) SELECT @OnlyDate AS OnlyDate--2014-03-26 00:00:00.000
Если вы присваиваете результаты столбцу или переменной, укажите тип даты, и преобразование будет неявным.
DECLARE @Date DATE = GETDATE() SELECT @Date --> 2017-05-03
Я думаю, что это будет работать в вашем случае:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate //here date is obtained as 1990/09/25
хорошо, хотя я немного опоздал :), вот еще одно решение.
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')
даже используя древний 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", вероятно, делает математику. Так что это может быть немного медленнее, чем метод datediff, но для меня это гораздо более ясно. Особенно когда я хочу в группу только год и месяц (день по 1).
дата:
SELECT CONVERT(date, GETDATE()) SELECT CAST(GETDATE() as date)время:
SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
начиная с SQL SERVER 2012, Вы можете сделать это:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
на SQL Server 2000
CAST( ( STR( YEAR( GETDATE() ) ) + '/' + STR( MONTH( GETDATE() ) ) + '/' + STR( DAY( GETDATE() ) ) ) AS DATETIME)
почему вы не используете 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'часть
это отсутствовало во всех ответах, может быть не самым эффективным, но очень легко писать и понимать, не нужен стиль, нет сложных функций даты.
SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
просто вы можете сделать это так:
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
вы можете использовать следующие дату и формат даты:
DATENAME = > возвращает символьную строку, представляющую заданную часть указанной даты
DATEADD = > the используется для возвращения одной части времени, такие как год, месяц, день, час, минута и т. д.
DATEPART = > возвращает целое число, представляющее указанную часть указанной даты.
CONVERT()= > наCONVERT()функция a общие функции, которая преобразует выражение одного типа данных в другой. ЭтотCONVERT()функция может использоваться для отображения данных даты/времени в различных форматах.
дата (поле даты и времени) и DATE_FORMAT(дата и время, '%Y - %m - %d') Как возвращает дата дата и время
Comments