SELECT GETDATE()
Возвращает: 2008-09-22 15:24:13.790
Мне нужна эта часть даты без части времени: 2008-09-22 00:00:00.000
Как я могу это получить?
SELECT GETDATE()
Возвращает: 2008-09-22 15:24:13.790
Мне нужна эта часть даты без части времени: 2008-09-22 00:00:00.000
Как я могу это получить?
На 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
Является ли этот способ лучше или хуже с точки зрения производительности, чем использование других методов преобразования? Или это ничтожно мало?
Мой метод работает быстрее. Он не требует преобразования в varchar и позволяет эффективно вычислять дату
+1 Похоже, этот на 35% быстрее, чем обычно используемый метод double convert () (который я также использовал в течение многих лет). Хороший.
Если это 35%, чем метод CONVERT, вы должны задаться вопросом, насколько быстрее будет встроенное усечение - это должна быть самая распространенная операция, связанная с датой и временем, которую я когда-либо делал - я собираюсь посмотреть на переключение к этому механизму.
Единственный недостаток вашего решения, который я вижу, заключается в том, что если вы не знаете, что оно делает, оно будет немного тупым. Использование метода двойного преобразования делает ваши намерения более очевидными для всех разработчиков кода. Кстати, я не голосовал против вас. Думаю, я тоже начну пользоваться вашим методом. Спасибо @aku
+1 Возможно, вам будет интересно увидеть отредактированный ответ Рикардо С. (поскольку это вики сообщества и фактически неверно, я исправил его). У вас также есть поддержка вашего вопроса.
Также не пропустите этот пост, в котором показаны результаты тестирования производительности.
@pilavdzice Установка даты и времени на полночь этого дня делает ОТНОСИТЕЛЬНО ВРЕМЕНИ. Какого результата вы ждете? Тип данных datetime
не может иметь вообще никакого времени . Я думаю, вы путаете хранение данных с пользовательским представлением. Если все, что вам нужно, это способ показать пользователю строку без временной части (не нулей, только пробелы), тогда вам просто нужен Convert(varchar(30), @Date, 101)
или что-то подобное. См. Электронная документация по SQL Server • Приведение и преобразование для получения дополнительной информации.
Стоит отметить, что это не распространяется на агрегирование данных за месяц или год. Вы должны изменить условия, чтобы это сработало. SELECT DATEADD (mm, DATEDIFF (mm, 0, @YourDate), 0) расширяется для mm / yy iirc
@aku Есть ли способ получить только Datepart как "2008-09-22" , а не "2008-09-22 00: 00: 00.000" без преобразования его в VARCHAR . Сейчас использую CONVERT(VARCHAR(10), @dateTime, 101) AS MyDate
@ user1671639 тип данных datetime всегда содержит как дату, так и время, вы не можете разумно хранить одно без другого - если вы не используете SQL Server 2008, и в этом случае есть также отдельные данные `` дата '' и `` время '' типы. Если вы используете CONVERT () таким образом, вам действительно нужна строка для последующего использования, поэтому вы застрянете, делая это так - хотя было бы лучше, если бы вы использовали функции форматирования даты вместо того, чтобы вырезать дату - или через CAST(... AS DATE)
или CONVERT(DATE, ...)
, которые довольно часто упоминались именно на этой странице.
Я рекомендую изменить ответ на SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
, потому что тогда dd
можно заменить на любое другое ключевое слово datepart
, чтобы обрезать ваше datetime
на произвольном уровне.
выберите приведение (createddate as date) из таблицы, где createdate - ваш столбец datetime
Синтаксис:
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]
Поскольку с тех пор, как на этот вопрос были даны ответы, было внесено много изменений, я хотел предложить новый способ получения запрошенного результата. Существует два способа анализа данных 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
.
Удачного кодирования!
Просто сделайте:
SELECT CAST(date_variable AS date)
или с PostgreSQL:
SELECT date_variable::date
Если вы хотите, чтобы отображалась дата 2008-09-22 00:00:00.000
тогда вы можете округлить его, используя
SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))
Это покажет дату в формате вопроса
Проще всего использовать:
SELECT DATE(GETDATE())
ДАТА - это не функция, чувак.
Чтобы уточнить... DATE() - это функция в mySQL, но этот вопрос касается SQL Server. В mySQL вы можете использовать функцию DATE() для извлечения даты из элемента даты и времени таким образом, что DATE("2021-06-15 09:34:21") возвращает "2021-06-15", но GETDATE() не функция mySQL, поэтому он смешивает языки SQL. Эквивалентом этого в mySQL будет DATE(NOW())... но mySQL делает это совершенно ненужным, поскольку вместо этого вы можете просто вызвать CURDATE().
Вау, позвольте мне посчитать, как вы можете это сделать. (не каламбур)
Чтобы получить нужные результаты в этом формате, в частности:
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 имеет такую избыточность?
Понятия не имею, но они знают. Может быть, кто-то умнее меня сможет ответить на этот вопрос.
Надеюсь, это кому-нибудь поможет.
Последние 3 — это полные штампы даты и времени, которые усекаются. 121 не разделен буквой «Т», в то время как два других разделены. 127 является более точным при работе с форматами DATETIME2, но с обычными датами и временем они округляются до тех же значений; поэтому в другом контексте они возвращают 3 разных значения даты и времени. Что касается второго, то A = B можно использовать немного иначе, чем A AS B, используя другие функции, кроме этой, но при использовании этих функций они работают одинаково. Что касается Convert vs Cast, Cast — это встроенная функция ANSI, а Convert — специфичная для SQL. Convert имеет больше возможностей, но не всегда так эффективен.
вы можете использовать, как показано ниже, для различных типов вывода только для даты
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103))
-----дд/мм/гггг
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
------мм/дд/гггг
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))
select cast(createddate as date) as derivedate from table
createdate — это ваш столбец даты и времени, это работает для sqlserver
Мой стиль
select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
select convert(getdate() as date)
select CONVERT(datetime,CONVERT(date, getdate()))
Я думаю, вы скопировали два оператора выбора, но скопировали второй выбор внутри первого выбора.
Только мои 2 цента стоят, но первый оператор SELECT: «выбрать конвертировать (получить дату () как дату)» не работает. «Дата» и «getdate()» должны были быть инвертированы, как в коде ниже. «SELECT CONVERT(DATE, GETDATE() )» Вы также можете использовать функцию «CAST()». Любой из них вернет те же результаты. «ВЫБЕРИТЕ ПРИВОД (ПОЛУЧИТЕ ДАТУ () КАК ДАТУ)»
Мой общий подход к получению даты без части времени..
SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)
SELECT CAST(GETDATE() AS DATE)
Вы можете сделать это просто так:
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
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.
Рикардо Си, хорошее расследование! Какую версию SQL-сервера вы используете? На MSSQL2000 метод с dateiff работает для меня немного быстрее.
Отметим, что я выполнил тест 1000 000 раз. Думаю, для реальных сценариев разница в производительности не будет заметна.
Аку, я использовал для этого теста SQL Server 2005 Express. Я работаю над 2000 на работе, и я протестирую его с таблицей с более чем 24 миллионами строк и посмотрю, что из этого получится.
Аку, те же результаты. Никакой разницы в производительности более десяти миллионов строк.
Утверждения о равной производительности не соответствуют действительности. Конечно же, планы выполнения будут такими же !!! Измерение производительности на них ДОЛЖНО выполняться путем сравнения использования ЦП, а не изучения планов выполнения.
Используйте функцию Format()
.
Уже существует несколько ответов и типов форматирования для SQL-сервера. Но большинство методов несколько неоднозначны, и вам будет сложно запомнить числа для типа формата или функций, относящихся к определенному формату даты. Поэтому в следующих версиях SQL-сервера вариант получше.
FORMAT ( value, format [, culture ] )
Параметр культуры очень полезен, так как вы можете указать дату в соответствии с вашими зрителями.
Вы должны помнить d (для маленьких шаблонов) и 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)
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日
Если вам нужны другие форматы, вы можете перейти по адресу:
Чтобы пропустить культуру, пользовательские форматы позволяют вам установить свои собственные, например FORMAT (@d, 'yyyyy-MM-dd')
, чтобы получить 2011-10-11.
Начиная с 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)
Дата:
SELECT CONVERT(date, GETDATE()) SELECT CAST(GETDATE() as date)
Время:
SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
Если вы назначаете результаты столбцу или переменной, присвойте ему тип DATE, и преобразование будет неявным.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
Хорошо, хотя я немного опоздал :) Вот другое решение.
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')
В вашем первом примере все еще есть компонент времени. Вопрос был в том, как это убрать.
Вы можете просто использовать приведенный ниже код, чтобы получить только часть даты и избежать части времени в SQL:
SELECT SYSDATE TODAY FROM DUAL;
Мало того, что для Oracle, не для MS SQL - это даже не правильно. Чтобы получить часть даты только от Oracle, нужно использовать TRUNC(SYSDATE)
Я знаю, что это устарело, но я не вижу, чтобы кто-то так это сказал. Насколько я могу судить, это стандарт ANSI.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Было бы хорошо, если бы Microsoft могла также поддерживать стандартную переменную CURRENT_DATE ANSI.
select {fn current_date()} as today
у меня работает.
@brianary - Это хорошо, но это не ANSI SQL.
Это достаточно справедливо, и ваш ответ хорошо переносится, но я полагал, что пока мы работаем с T-SQL, это также работает (и показывает, что реализация ANSI CURRENT_DATE была бы тривиальной для MS).
Дата (дата и время, поле) и DATE_FORMAT (дата и время, '% Y-% m-% d') оба возвращает только дату от даты и времени
В вопросе указано SQL Server. Это похоже на MySQL?
Я предпочитаю следующее, о чем не упоминалось:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
Он также не заботится о локальном или двойном преобразовании - хотя каждая 'datepart', вероятно, выполняет математические вычисления. Так что он может быть немного медленнее, чем метод dateiff, но для меня он намного понятнее. Особенно, если я хочу сгруппировать только по году и месяцу (установите день на 1).
Даже при использовании старого 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
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
Это предложение было затронуто другими ответами (более одного раза).
почему бы вам не использовать 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'
часть
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
Для части даты и форматирования даты можно использовать следующее:
DATENAME => Возвращает строку символов, представляющую указанную датучасть указанной даты
DATEADD => Функция DATEPART()
используется для возврата одной части даты/времени, такой как год, месяц, день, час, минута и т. д.
DATEPART =>Возвращает целое число, представляющее указанную часть даты указанной даты.
CONVERT()
= > Функция CONVERT()
— это общая функция, которая преобразует выражение одного типа данных в другой.
То
Функция CONVERT()
может использоваться для отображения данных даты/времени в различных форматах.
Если вам нужен результат в виде varchar
, вы должны пройти через
SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
, который уже упоминался выше.
Если вам нужен результат в формате даты и времени, вы должны использовать любой из запросов ниже
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014-03-26 00:00: 00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014-03-26 00:00: 00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014-03-26 00:00: 00.000
Для возврата в формате даты
CAST (Дата заказа как дата)
Приведенный выше код будет работать в sql server 2010
Он вернется как 12/12/2013
Для SQL Server 2012 используйте приведенный ниже код
CONVERT(VARCHAR(10), OrderDate , 111)
Это возвращает мне дату с нулевым временем, а не только дату
Могу ли я узнать, какую версию SQL-сервера вы используете?
@MaheshML возвращает дату и время в MS SQL 2012.
Прекрасно работает в SQL Azure
@MaheshML SQL Server 2010 не существует.
Думаю, в вашем случае это сработает:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
Чтобы получить указанный результат, я использую следующую команду.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Надеюсь, это пригодится.
ЕСЛИ вы хотите использовать CONVERT и получить тот же результат, что и в исходном вопросе, то есть yyyy-mm-dd, тогда используйте CONVERT(varchar(10),[SourceDate as dateTime],121)
тот же код, что и предыдущая пара ответов, но код для преобразования в yyyy- мм-дд с тире - 121.
Если я смогу на секунду залезть в свою мыльницу, такое форматирование не относится к уровню данных , и поэтому это было невозможно без глупого высокого -overhead «трюки» до появления SQL Server 2008, когда будут представлены актуальные типы данных datepart. Выполнение таких преобразований на уровне данных - это огромная трата накладных расходов для вашей СУБД, но, что более важно, как только вы сделаете что-то подобное, вы в основном создадите потерянные данные в памяти, которые, как я полагаю, вы затем вернетесь в программу. Вы не можете поместить его обратно в другой столбец 3NF + или сравнить его с чем-либо, набранным без возврата, поэтому все, что вы сделали, это добавили точки отказа и удалили реляционную ссылку.
Вы должны ВСЕГДА возвращать свой тип данных dateTime в вызывающую программу и на уровне PRESENTATION, вносить необходимые изменения. Как только вы начнете преобразовывать вещи перед возвращая их вызывающей стороне, вы удаляете из приложения всякую надежду на ссылочную целостность. Это предотвратит операцию UPDATE или DELETE, если вы не выполните какое-либо ручное восстановление, которое снова подвергает ваши данные ошибкам человека / кода / гремлина, когда в этом нет необходимости.
За исключением, скажем, запроса , который извлекает все записи, соответствующие заданной пользователем дате в качестве части даты определенного поля времени. Удачи в этом только на уровне представления. (Вам не нужно конвертировать, вы можете использовать арифметику даты, но вы поняли ...)
@ Андрей, какое это имеет значение? Вы говорите WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
- нет абсолютно никаких причин вычеркивать время из столбца.
@AaronBertrand Это работает только при условии, что вход @Date
имеет нулевую временную часть. Если это не так, вам все равно нужно знать, как сократить время на стороне сервера. Я согласен с этим ответом, что форматирование следует оставить на уровне представления, но я не согласен с тем, что оставление этого для внешнего интерфейса означает, что вам не нужно знать быстрый способ усечения.
@Andrew все, что вам нужно сделать, это сделать входной параметр DATE. Я по-прежнему считаю, что вам никогда не следует применять такое усечение к столбцу , даже если это первый инстинкт большинства людей.
@AaronBertrand и , который предполагает, что вы контролируете тип данных параметра. Прекрасно в хранимой процедуре, но не в других ситуациях. Почему бы не выполнить приведение, чтобы убедиться, что параметр является нужным вам типом?
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
При использовании SQL 2008 и выше:
select cast(getdate() as date)
Сообщение 243, уровень 16, состояние 1, строка 1 Дата типа не является определенным системным типом.
@FredrickGauss: Какой тип, Дата? Какую версию SQL Server вы используете?
Остерегаться! объявить @ date1 datetime = '2015-09-30 20:59: 59.999'; select cast (@ date1 as date) возвращает '2015-10-01'
@abatishchev извини, это должно было быть declare @date1 datetime = '2015-09-30 23:59:59.999';select cast(@date1 as date)
@Nick: это проблема с DateTime. используйте вместо него DateTime2
, и он отлично работает. sqlfiddle.com/#!6/9eecb7/2833
@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
Один из этих легко запоминающихся приемов SQL. Как говорит Майк, только с 2008 года, но, если вы где-то найдете базу данных 2005 года и предыдущую, у вас может быть много проблем :)
@NixVerAZ Я считаю, что есть ровно 0 причин для запуска SQL Server 2005 в конце 2016 года. Это чистый идиотизм, не так ли? Хороший признак того, что там что-то ужасно не так.
Мне нравится использование ANSI std «CAST ()» - если переносимость в наши дни является проблемой (или даже достижимой) :). Также рекомендуется, если вы хотите сохранить точность: msdn.microsoft.com/en-us/library/ms187928.aspx
@abatischchev - 1 причина, которая относится к большему количеству экземпляров, чем вы считаете возможным: руководство отказывается утверждать бюджет на обновление антиквариата, пока кому-то удается поддерживать их работу. Даже SQL Server 2000, работающий под Windows 2000, все еще жив. SQL Server 2005 Express: около 50 экземпляров только в моей компании (нет, не в моей, в которой я работаю).
Проблема '2015-09-30 20: 59: 59.999', похоже, больше не относится к Sql Server 2016.
Можно пойти еще дальше со стандартом ANSI, используя SELECT CAST(CURRENT_TIMESTAMP AS DATE)
(CURRENT_TIMESTAMP
эквивалентно GETDATE()
).
SQLServer 2008 теперь имеет тип данных date, который содержит только дату без компонента времени. Любой, кто использует SQLServer 2008 и более поздних версий, может делать следующее:
SELECT CONVERT(date, GETDATE())
В SQL 2008 также есть тип данных «время», который отвечает на вторую половину вопроса о разделении даты и времени.
К вашему сведению, я протестировал различные методы отсечения времени от дат, и это был самый быстрый метод. Конечно, разница была небольшая, но она была явно быстрее в большом количестве выполнений.
мол про sqlserver 2005 ??
@ Dr.MAF. Завершая круг, ответ до 2008 года находится здесь: coderhelper.com/questions/113045/…
Использование FLOOR () - просто вырезать временную часть.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
Этот метод не самый быстрый и неявно учит людей тому, что приведение дат к float является точным, а это не так. Пожалуйста, смотрите этот пост для более подробной информации.
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.
Все эти методы хороши, но какой из них вы предлагаете использовать?
Обратите внимание, что "правильная" версия двух верхних - select dateadd(dd, datediff(dd, 0, getdate()), 0)
, потому что dd
могут быть заменены на любое из <19194874705> datepart
ключевых слов для обрезки даты в любом выбранном вами сегменте. . (Также обратите внимание, что dd
- это просто сокращение от day
.)
Вы можете использовать функцию CONVERT
, чтобы вернуть только дату. См. Ссылку (-ы) ниже:
Обработка даты и времени в SQL Server 2000
Синтаксис использования функции преобразования:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Попробуйте это:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
Приведенный выше оператор преобразует ваш текущий формат в YYYY/MM/DD
, перейдите по по этой ссылке, чтобы выбрать предпочтительный формат.
Это возвращает мне "2008/09/22"
SELECT CONVERT (VARCHAR (10), GETDATE (), 101) - формат mm/dd/yyyy
.
если вы сортируете на основе необработанного текстового значения (вне БД), то лучше использовать «японский» формат
Следует отметить, что SQL Server 2008 включает отдельный тип данных DATE для хранения только дат без компонента времени. Подробнее здесь: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Не пропустите этот пост, в котором показаны результаты тестирования производительности различных методов удаления времени.
@ Мартин странно, спасибо, давай попробуем еще раз,.
Не вводите в заблуждение голосованием и принятым ответом, взгляните на coderhelper.com/a/126984/1155650
@Rohit не у всех есть SQL Server 2008 или новее.
@hktegner - это должно вводить в заблуждение тех, у кого есть. Также есть одна версия ниже 2008 (то есть: 2005), где, как и после нее, у нас есть 4 и продолжает расти.
@Rohit Вы ошибочно полагаете, что 2008 - единственная версия, которая волнует людей. (Есть и другие версии в дикой природе.) Голоса говорят сами за себя.
Для будущих читателей: mssqltips.com/sqlservertip/1145/… также полезен для получения правильного формата при использовании convert.
ВЫБЕРИТЕ ДОБАВЛЕНИЕ ДАТЫ (дд, 0, РАЗНДАТ (дд, 0, @ваша_дата))