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
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
на произвольном уровне.
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
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 к плавающей и обратно не всегда приводит к исходному значению.
Помните, ребята: не верьте никому. Посмотрите статистику производительности и проверьте сами!
Будьте осторожны при тестировании своих результатов. Выбор множества строк для клиента позволит скрыть разницу в производительности, поскольку для отправки строк по сети требуется больше времени, чем для выполнения вычислений. Поэтому убедитесь, что работа для всех строк выполняется сервером, но нет набора строк, отправленного клиенту.
У некоторых людей возникает путаница, когда оптимизация кэша влияет на запросы. Выполнение двух запросов в одном пакете или в разных пакетах не влияет на кэширование. Таким образом, вы можете либо завершить кеш вручную, либо просто выполнять запросы туда-сюда несколько раз. Любая оптимизация для запроса № 2 также повлияет на любые последующие запросы, поэтому, если хотите, исключите выполнение # 1.
Вот полный тестовый скрипт и результаты производительности, которые доказывают, что DateDiff существенно быстрее, чем конвертация в varchar.
Попробуй это:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
Приведенное выше заявление преобразует ваш текущий формат в YYYY/MM/DD
, пожалуйста, перейдите по этой ссылке, чтобы выбрать предпочтительный формат.
mm/dd/yyyy
формат.
Для возврата в формате даты
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
Использование FLOOR () - просто отрезать часть времени.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
Используйте 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日
Если вы хотите больше форматов, вы можете перейти к:
Если вы хотите использовать 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 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
.)
Чтобы получить указанный результат, я использую следующую команду.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Я Holpe это полезно.
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
Я думаю, что это будет работать в вашем случае:
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
Свидание:
ВЫБРАТЬ КОНВЕРТ (дата, GETDATE ()) ВЫБЕРИТЕ CAST (GETDATE () в качестве даты)
Время:
ВЫБРАТЬ КОНВЕРТ (время, GETDATE (), 114) ВЫБЕРИТЕ CAST (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
почему вы не используете 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'
часть
Я знаю, что это старо, но я не вижу, где кто-то так сказал. Из того, что я могу сказать, это стандарт ANSI.
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Было бы хорошо, если бы Microsoft также могла поддерживать стандартную переменную ANSI CURRENT_DATE.
select {fn current_date()} as today
работает для меня.
Я поддерживаю следующее, которое не было упомянуто:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
Он также не заботится о локальном или двойном преобразовании - хотя каждый «datepart», вероятно, выполняет математику. Так что это может быть немного медленнее, чем метод датедифф, но для меня это гораздо более понятно. Особенно, когда я хочу сгруппировать по году и месяцу (установите день на 1).
В этом случае, только дата, вы нам запустите этот запрос:
Вы можете использовать следующие для части даты и форматирования даты:
DATENAME => Возвращает символьную строку, которая представляет указанную часть даты указанной даты
DATEADD => DATEPART()
Функция используется для возврата одной части даты / времени, такой как год, месяц, день, час, минута и т. Д.
DATEPART => Возвращает целое число, которое представляет указанную часть даты указанной даты.
CONVERT()
=> CONVERT()
Функция - это общая функция, которая преобразует выражение одного типа данных в другой. Эта
CONVERT()
функция может использоваться для отображения даты / времени в разных форматах.