Это продолжает часто собирать дополнительные голоса, даже спустя несколько лет, и поэтому мне нужно обновить его для современных версий Sql Server. Для Sql Server 2008 и более поздних версий это просто:
cast(getDate() As Date)
Обратите внимание, что последние три абзаца в нижней части все еще применяются, и вам часто нужно сделать шаг назад и найти способ избежать броска в первую очередь.
Но есть и другие способы сделать это. Вот самые распространенные.
Правильный путь (новый с Sql Server 2008):
cast(getdate() As Date)
Правильный путь (старый):
dateadd(dd, datediff(dd,0, getDate()), 0)
Сейчас он старше, но все же стоит знать, потому что он также может легко адаптироваться к другим временным точкам, таким как первый момент месяца, минуты, часа или года.
Этот правильный путь использует документированные функции, которые являются частью стандарта ANSI и гарантированно работают, но это может быть несколько медленнее. Он работает, определяя, сколько дней существует с 0 до текущего дня, и добавляя это количество дней к 0. Это будет работать независимо от того, как хранится ваша дата и время, и независимо от вашей локали.
Быстрый путь:
cast(floor(cast(getdate() as float)) as datetime)
Это работает, потому что столбцы даты и времени хранятся в виде 8-байтовых двоичных значений. Приведите их к плавающему, напишите их, чтобы удалить дробь, и временная часть значений исчезнет, когда вы приведете их обратно к datetime. Это все немного сдвигается без сложной логики, и это очень быстро.
Помните, что это зависит от деталей реализации, которые Microsoft может изменить в любое время, даже при автоматическом обновлении службы. Это также не очень портативный. На практике очень маловероятно, что эта реализация изменится в ближайшее время, но все же важно осознавать опасность, если вы решите ее использовать. И теперь, когда у нас есть возможность разыграть дату, это редко необходимо.
Неправильный путь:
cast(convert(char(11), getdate(), 113) as datetime)
Неправильный способ работает путем преобразования в строку, усечения строки и преобразования обратно в дату и время. Это неправильно по двум причинам: 1) это может не работать во всех локалях и 2) это самый медленный из возможных способов сделать это ... и не только немного; это на порядок или два медленнее, чем другие варианты.
Обновление В последнее время я получал несколько голосов, и поэтому я хочу добавить, что с момента публикации я увидел довольно веские доказательства того, что Sql Server оптимизирует разницу в производительности между «правильным» и «быстрым» способами. Это означает, что вы должны отдать предпочтение первым.
В любом случае вы хотите написать свои запросы, чтобы избежать необходимости делать это в первую очередь . Это очень редко, что вы должны сделать эту работу с базой данных.
В большинстве мест база данных уже является вашим узким местом. Обычно это сервер, который является самым дорогим для добавления оборудования для повышения производительности, и самый сложный для правильной установки этих дополнений (например, необходимо балансировать диски с памятью). Кроме того, его сложнее масштабировать как с технической точки зрения, так и с точки зрения бизнеса; Технически гораздо проще добавить веб-сервер или сервер приложений, чем сервер базы данных, и даже если это неверно, вы не платите $ 20 000 за серверную лицензию для IIS или apache.
Суть, которую я пытаюсь подчеркнуть, заключается в том, что по возможности вы должны выполнять эту работу на уровне приложений. Только раз , когда вы когда - нибудь найти себе усечения DateTime на Sql Server, когда вам нужно сгруппировать в день, и даже тогда , вероятно , вы должны иметь дополнительный набор столбцов в качестве вычисляемого столбца, поддерживается во время вставки / обновления или техническое обслуживание в логике приложения. Получите эту тяжелую работу с вашими процессорами из вашей базы данных.
cast(getdate() as date)
?getdate()
Вот замена для любого источника даты и времени, который у вас может быть.Только для SQL Server 2008
Затем приведите его к дате и времени, если хотите
источник
Просто для более полного ответа, вот рабочий способ усечения до любой из частей даты вниз и включая минуты (замените
GETDATE()
на дату для усечения).Это отличается от принятого ответа тем, что вы можете использовать не только
dd
(дни), но и любую из частей даты (см. Здесь ):Обратите внимание, что в приведенном выше выражении
0
константная дата начала года (1900-01-01). Если вам нужно усечь меньшие части, например, секунды или миллисекунды, вам нужно взять постоянную дату, которая ближе к дате, которая будет усечена, чтобы избежать переполнения.источник
dateadd(minute, datediff(minute, 0, GETDATE()) / 15 * 15, 0)
Фрагмент, который я нашел в Интернете, когда мне нужно было сделать это:
источник
DateAdd(dd, DateDiff(...), 0)
. Это может укусить вас, если вы не будете осторожны.В SQl 2005 ваша функция trunc_date может быть написана так.
(1)
Первый способ намного чище. Он использует только 3 вызова метода, включая финальный CAST (), и не выполняет конкатенацию строк, что является автоматическим плюсом. Кроме того, здесь нет огромных типов бросков. Если вы можете себе представить, что могут быть представлены метки даты / времени, то преобразование дат в числа и обратно в даты является довольно простым процессом.
(2)
Если вы обеспокоены реализацией в Microsoft datetime (2) или (3), может быть в порядке.
(3)
В-третьих, более многословный метод. Для этого необходимо разбить дату на части года, месяца и дня, собрать их в формате «гггг / мм / дд», а затем привести их обратно к дате. Этот метод включает 7 вызовов метода, включая заключительный CAST (), не говоря уже о конкатенации строк.
источник
источник
выберите приведение (floor (cast (getdate () как float)) в качестве даты и времени) Ссылка на эту ссылку: http://microsoftmiles.blogspot.com/2006/11/remove-time-from-datetime-in-sql-server.html
источник
Для тех из вас, кто пришел сюда и ищет способ обрезать поле DATETIME до значения, меньшего целого дня, например каждую минуту, вы можете использовать это:
так что если бы сегодня было
2010-11-26 14:54:43.123
то это вернулось бы2010-11-26 14:54:00.000
.Чтобы изменить интервал, к которому он переходит, замените 1440.0 на число интервалов в дне, например:
(Всегда ставьте
.0
на конец, чтобы неявно бросить на поплавок.)Для тех из вас , интересно , что
(3.0/86400000)
это и в моем расчете, SQL Server 2005 , кажется, не гипс отFLOAT
кDATETIME
точно, так что это добавляет 3 миллисекунды до того пола его.источник
datetime2
типом данных.Этот запрос должен дать вам результат, эквивалентный
trunc(sysdate)
в Oracle.Надеюсь это поможет!
источник
Вы также можете извлечь дату
using Substring
из переменной datetime, а приведение к datetime будет игнорировать часть времени.Кроме того, вы можете получить доступ к частям переменной datetime и объединить их в усеченную дату конструкции, что-то вроде этого:
источник
Oracle:
SQL Server:
Аналогичным образом может использоваться для сокращения минут или часов от даты.
источник
Вы можете просто сделать это (SQL 2008):
2009-05-28
источник
TRUNC (aDate, 'DD') будет усекать мин, сек и часы
SRC: http://www.techonthenet.com/oracle/functions/trunc_date.php
источник