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
datetime
данных не может иметь никакого времени вообще . Я думаю, что вы путаете хранение данных с презентацией пользователя. Если все, что вам нужно, это способ показать пользователю строку, которая не имеет временной части (не нули, просто пробелы), тогда вы просто хотите Convert(varchar(30), @Date, 101)
или что-то подобное. См. Электронную документацию по SQL Server • Преобразование и преобразование для получения дополнительной информации. CAST(... AS DATE)
или CONVERT(DATE, ...)
, что упоминалось довольно часто на этой самой странице. SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
потому что тогда его dd
можно заменить на любое другое datepart
ключевое слово, чтобы усечь его datetime
на произвольном уровне. Попробуй это:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
Приведенное выше заявление преобразует ваш текущий формат в YYYY/MM/DD
, пожалуйста, перейдите по этой ссылке, чтобы выбрать предпочтительный формат.
mm/dd/yyyy
формат. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Вы можете использовать CONVERT
функцию, чтобы вернуть только дату. Смотрите ссылку (ы) ниже:
Манипуляции с датой и временем в SQL Server 2000
Синтаксис для использования функции преобразования:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
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
s может быть выгружен для любого из тех datepart
ключевых слов , чтобы отсечь дату в любом сегменте вы выбираете. (Также обратите внимание, что dd
это просто аббревиатура day
.)Использование FLOOR () - просто отрезать часть времени.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
DATEADD и DATEDIFF лучше, чем преобразование в varchar. Оба запроса имеют один и тот же план выполнения, но планы выполнения в основном касаются стратегий доступа к данным и не всегда показывают неявные затраты, связанные с затратами времени ЦП на выполнение всех этапов. Если оба запроса выполняются для таблицы с миллионами строк, время ЦП с использованием DateDiff может быть близко к 1/3 времени преобразования ЦП!
Чтобы увидеть планы выполнения запросов:
set showplan_text on
GO
И DATEADD, и DATEDIFF будут выполнять CONVERT_IMPLICIT.
Хотя решение CONVERT проще и легче читать для некоторых, это является более медленным. Нет необходимости возвращаться к 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)) FROM DatesTable
|--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
Использование FLOOR (), как предложено @digi, имеет производительность, близкую к DateDiff, но не рекомендуется, поскольку приведение типа данных datetime к float и back не всегда приводит к исходному значению.
Помните, ребята: не верьте никому. Посмотрите статистику производительности и протестируйте ее сами!
Будьте осторожны при тестировании своих результатов. Выбор множества строк для клиента позволит скрыть разницу в производительности, поскольку для отправки строк по сети требуется больше времени, чем для выполнения вычислений. Поэтому убедитесь, что работа для всех строк выполняется сервером, но нет набора строк, отправленного клиенту.
У некоторых людей возникает путаница, когда оптимизация кэша влияет на запросы. Выполнение двух запросов в одном пакете или в разных пакетах не влияет на кэширование. Таким образом, вы можете либо завершить кеш вручную, либо просто выполнять запросы туда и обратно несколько раз. Любая оптимизация для запроса № 2 также повлияет на любые последующие запросы, поэтому, если хотите, исключите выполнение # 1.
Вот полный сценарий тестирования и результаты производительности, которые доказывают, что DateDiff существенно быстрее, чем конвертация в varchar.
SQLServer 2008 теперь имеет тип данных «дата», который содержит только дату без компонента времени. Любой, кто использует SQLServer 2008 и выше, может делать следующее:
SELECT CONVERT(date, GETDATE())
Если используется SQL 2008 и выше:
select cast(getdate() as date)
DateTime2
вместо этого, и он работает нормально. sqlfiddle.com/#!6/9eecb7/28332015-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,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)
тот же код, что и предыдущая пара ответов, но код для преобразования в yyyy-mm-dd с тире 121.
Если я смогу войти в свой мыльный ящик на секунду, этот вид форматирования не относится к уровню данных , и поэтому он был невозможен без глупых «трюков» с высокими накладными расходами до SQL Server 2008, когда действительные типы данных datepart представил. Выполнение таких преобразований на уровне данных является огромной тратой накладных расходов на вашу СУБД, но, что более важно, в момент, когда вы делаете что-то подобное, вы в основном создавали потерянные в памяти данные, которые, как я полагаю, затем вы вернетесь в программу. Вы не можете поместить его обратно в другой столбец 3NF + или сравнить его с чем-либо набранным без возврата, поэтому все, что вы сделали, - это добавили точки отказа и удалили реляционную ссылку.
Вы должны ВСЕГДА идти вперед и возвращать свой тип данных dateTime в вызывающую программу и на уровне PRESENTATION вносить любые необходимые изменения. Как только вы преобразуете вещи перед тем, как возвращать их вызывающей стороне, вы удаляете все надежды на ссылочную целостность из приложения. Это предотвратит операцию ОБНОВЛЕНИЕ или УДАЛЕНИЕ, опять же, если вы не сделаете какую-то ручную реверсию, которая снова подвергает ваши данные ошибкам человека / кода / гремлина, когда в этом нет необходимости.
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
- нет абсолютно никакой причины убирать время из колонки. @Date
имеет нулевую часть времени. В случае, если это не так, вам все равно нужно знать, как сократить время на стороне сервера. Я согласен с этим ответом, что форматирование должно быть оставлено на уровне представления, но я не согласен с тем, что если оставить его для внешнего интерфейса, вам не нужно знать быстрый способ усечения. Чтобы получить указанный результат, я использую следующую команду.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Я Holpe это полезно.
Я думаю, что это будет работать в вашем случае:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
Для возврата в формате даты
CAST (Дата заказа как дата)
Приведенный выше код будет работать в SQL Server 2010
Он вернется, как 12.12.2013
Для SQL Server 2012 используйте следующий код
CONVERT(VARCHAR(10), OrderDate , 111)
Если вам нужен результат как 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
Вы можете использовать следующие для части даты и форматирования даты:
DATENAME => Возвращает символьную строку, которая представляет указанную часть даты указанной даты
DATEADD => DATEPART()
Функция используется для возврата одной части даты / времени, такой как год, месяц, день, час, минута и т. Д.
DATEPART => Возвращает целое число, которое представляет указанную часть даты указанной даты.
CONVERT()
=> CONVERT()
Функция - это общая функция, которая преобразует выражение одного типа данных в другой. Эта
CONVERT()
функция может использоваться для отображения даты / времени в разных форматах.
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'
часть
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
Даже используя древний 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' вероятно делает математику. Так что это может быть немного медленнее, чем метод датедифф, но для меня это гораздо более понятно. Особенно, когда я хочу сгруппировать по году и месяцу (установите день на 1).
Date (поле даты и времени) и DATE_FORMAT (дата и время, «% Y-% m-% d») возвращают только дату от даты и времени
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
Я знаю, что это старо, но я не вижу, где кто-то так сказал. Из того, что я могу сказать, это стандарт ANSI.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Было бы хорошо, если бы Microsoft могла также поддерживать стандартную переменную ANSI CURRENT_DATE.
select {fn current_date()} as today
работает для меня. Вы можете просто использовать приведенный ниже код, чтобы получить только часть даты и избежать части времени в SQL:
SELECT SYSDATE TODAY FROM DUAL;
TRUNC(SYSDATE)
Хорошо, хотя я немного опоздал :), вот другое решение.
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')
Если вы присваиваете результаты столбцу или переменной, присвойте ему тип DATE, и преобразование будет неявным.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
Свидание:
ВЫБРАТЬ КОНВЕРТ (дата, GETDATE ()) ВЫБЕРИТЕ CAST (GETDATE () в качестве даты)
Время:
ВЫБРАТЬ КОНВЕРТ (время, GETDATE (), 114) ВЫБЕРИТЕ CAST (GETDATE () как время)
На SQL Server 2000
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
Начиная с SQL SERVER 2012, вы можете сделать это:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')