SELECT GETDATE()
Возврат: 2008-09-22 15:24:13.790
Я хочу эту часть даты без части времени: 2008-09-22 00:00:00.000
Как я могу это получить?
31 ответ
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 не требуются
- Не нужно думать о локали
datetime
не может иметь никакого времени вообще . Я думаю, вы путаете хранение данных с пользовательским представлением. Если все, что вам нужно, это способ показать пользователю строку без временной части (не нулей, только пробелы), тогда вам просто нужно Convert(varchar(30), @Date, 101)
или что-то подобное. См. Электронную документацию по SQL Server • Cast and Convert < / a> для получения дополнительной информации.
CAST(... AS DATE)
или CONVERT(DATE, ...)
, которые довольно часто упоминаются именно на этой странице.
SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
, потому что тогда dd
можно заменить на любой другой datepart
ключевое слово, чтобы обрезать datetime
на произвольном уровне.
На SQL Server 2000
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
Почему бы вам не использовать 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'
часть
Если вы назначаете результаты столбцу или переменной, присвойте ему тип DATE, и преобразование будет неявным.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
В этом случае, только дата, мы запустим этот запрос:
SELECT CONVERT (VARCHAR (10), getdate (), 111);
Я думаю, это сработает в вашем случае:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
Хорошо, хотя я немного опоздал :) Вот еще одно решение.
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')
Свидание:
SELECT CONVERT(date, GETDATE()) SELECT CAST(GETDATE() as date)
Время:
SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
Даже при использовании старого 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
Просто сделать:
SELECT CAST(date_variable AS date)
Или с PostgreSQL:
SELECT date_variable::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
Я знаю, что это устарело, но я не вижу, чтобы кто-то так это сказал. Насколько я могу судить, это стандарт ANSI.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Было бы хорошо, если бы Microsoft могла также поддерживать стандартную переменную CURRENT_DATE ANSI.
select {fn current_date()} as today
у меня работает.
Я предпочитаю следующее, о чем не упоминалось:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
Он также не заботится о локальном или двойном преобразовании - хотя каждая 'datepart', вероятно, выполняет математические вычисления. Так что он может быть немного медленнее, чем метод dateiff, но для меня он намного понятнее. Особенно, когда я хочу сгруппировать только по году и месяцу (установите день на 1).
Начиная с SQL SERVER 2012, вы можете сделать это:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
SQLServer 2008 теперь имеет тип данных «дата», который содержит только дату без компонента времени. Любой, кто использует SQLServer 2008 и более поздних версий, может делать следующее:
SELECT CONVERT(date, GETDATE())
При использовании SQL 2008 и выше:
select cast(getdate() as date)
DateTime2
, и он отлично работает. sqlfiddle.com/#!6/9eecb7/2833
2015-10-01
из-за ограничений DateTime
. Попробуйте без преобразования в Date
, это тоже дает 2015-10-01
! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1
=> 2015-10-01
Попробуй это:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
Приведенный выше оператор преобразует ваш текущий формат в YYYY/MM/DD
, см. эту ссылку , чтобы выбрать предпочтительный формат.
mm/dd/yyyy
.
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Для возврата в формате даты
CAST (Дата заказа как дата)
Приведенный выше код будет работать в sql server 2010.
Он вернется, как 12/12/2013
Для SQL Server 2012 используйте приведенный ниже код
CONVERT(VARCHAR(10), OrderDate , 111)
Вы можете использовать функцию CONVERT
, чтобы вернуть только дату. См. Ссылку (-ы) ниже:
Манипулирование датой и временем в SQL Server 2000
Синтаксис использования функции преобразования:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Если вам нужен результат в виде 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
Если вы используете 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日
Если вам нужно больше форматов, вы можете перейти по ссылке:
FORMAT (@d, 'yyyyy-MM-dd')
, чтобы получить 11.10.2011.
Используя FLOOR () - просто сократите временную часть.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
ЕСЛИ вы хотите использовать CONVERT и получить тот же результат, что и в исходном заданном вопросе, то есть yyyy-mm-dd, тогда используйте CONVERT(varchar(10),[SourceDate as dateTime],121)
тот же код, что и предыдущая пара ответов, но код для преобразования в yyyy-mm -dd с тире - 121.
Если я могу на секунду залезть в свою мыльницу, такого рода форматирование не относится к уровню данных , и поэтому это было невозможно без глупого высокого - накладные расходы до появления в SQL Server 2008 фактических типов данных datepart. Выполнение таких преобразований на уровне данных - это огромная трата накладных расходов для вашей СУБД, но, что более важно, как только вы делаете что-то подобное, вы в основном создаете потерянные данные в памяти, которые, как я предполагаю, вы затем вернетесь в программу. Вы не можете вернуть его в другой столбец 3NF + или сравнить его с чем-либо, набранным без возврата, поэтому все, что вы сделали, это добавили точки отказа и удалили реляционную ссылку.
Вы должны ВСЕГДА возвращать свой тип данных dateTime в вызывающую программу и на уровне PRESENTATION вносить все необходимые изменения. Как только вы приступите к преобразованию, перед возвратом их вызывающему абоненту, вы лишаете приложение всякой надежды на ссылочную целостность. Это предотвратит операцию UPDATE или DELETE, если вы не выполните какое-либо ручное восстановление, которое снова подвергает ваши данные ошибкам человека / кода / гремлина, когда в этом нет необходимости.
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
- нет абсолютно никаких причин вычеркивать время из столбца.
@Date
имеет нулевую временную часть. Если это не так, вам все равно нужно знать, как сократить время на стороне сервера. Я согласен с этим ответом, что форматирование должно быть оставлено на уровне представления, но я не согласен с тем, что оставление этого для внешнего интерфейса означает, что вам не нужно знать быстрый способ усечения.
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
могут быть заменены на любой из datepart
ключевые слова для обрезки даты в любом выбранном вами сегменте. (Также обратите внимание, что dd
- это просто сокращение от day
.)
Синтаксис:
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]
DATEADD и DATEDIFF лучше, чем CONVERTing в varchar. Оба запроса имеют один и тот же план выполнения, но планы выполнения в первую очередь связаны с стратегиями доступа к данным и не всегда показывают неявные затраты, связанные с процессорным временем, затрачиваемым на выполнение всех частей. Если оба запроса выполняются для таблицы с миллионами строк, время ЦП с использованием DateDiff может быть близко к 1/3 времени ЦП преобразования!
Чтобы просмотреть планы выполнения запросов:
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.
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
Чтобы получить указанный результат, я использую следующую команду.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Я надеюсь, это полезно.
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.