Как я могу усечь дату и время в SQL Server?

У меня была ошибка, когда я использовал ng-click

<a ng-click="#/search/San+Francisco">test</a>

вместо ng-href

<a ng-href="#/search/San+Francisco">test</a>

Надеюсь это может помочь

264
задан Jason Plank 10 October 2011 в 03:38
поделиться

5 ответов

Это продолжает часто собирать дополнительные голоса, даже несколько лет спустя, и поэтому мне нужно обновить его для современных версий 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)

Это работает, потому что столбцы datetime хранятся как 8-байтовые двоичные значения. Приведите их в состояние плавания, опустите их, чтобы удалить дробь, и временная часть значений исчезнет, ​​когда вы вернете их к datetime. Это просто битовый сдвиг без сложной логики, и это очень быстро.

Имейте в виду, что это зависит от детали реализации, которую Microsoft может изменить в любое время, даже при автоматическом обновлении службы. К тому же он не очень портативный. На практике очень маловероятно, что эта реализация изменится в ближайшее время, но это ' По-прежнему важно осознавать опасность, если вы решите его использовать. А теперь, когда у нас есть возможность преобразовать в дату, это редко необходимо.

Неправильный способ:

cast(convert(char(11), getdate(), 113) as datetime)

Неправильный способ работает, преобразовывая в строку, обрезая строку и преобразовывая обратно в дату-время. Это неверно по двум причинам: 1) он может работать не во всех регионах и 2) это самый медленный из возможных способов сделать это ... и не только немного; это вроде на порядок-два медленнее, чем другие варианты.


Обновление Это последнее время набирает голоса, и поэтому я хочу добавить к нему, что с тех пор, как я опубликовал это, я увидел довольно веские доказательства того, что Sql Server оптимизирует разницу в производительности между "правильным" способом и «быстрый» способ, то есть теперь вы должны отдавать предпочтение первому.

В любом случае вы хотите написать свои запросы, чтобы избежать необходимости делать это в первую очередь . Очень редко вам приходится проделывать эту работу с базой данных.

В большинстве случаев база данных уже является вашим узким местом. Обычно это сервер, который является самым дорогим для добавления оборудования для повышения производительности и самым сложным для правильного добавления этих добавлений (например, вам нужно сбалансировать диски с памятью). Кроме того, его сложнее всего масштабировать как с технической точки зрения, так и с точки зрения бизнеса; Технически намного проще добавить веб-сервер или сервер приложений, чем сервер базы данных, и даже если это было неверно, вы не платите более 20 000 долларов за серверную лицензию для IIS или apache.

Я пытаюсь подчеркнуть, что по возможности вы должны выполнять эту работу на уровне приложения. Единственный раз, когда вы должны когда-либо усекать дату и время на Sql Server, когда вам нужно группировать по дням, и даже тогда вам, вероятно, следует настроить дополнительный столбец как вычисляемый столбец, поддерживаемый при вставке / обновлять время или поддерживается в логике приложения. Сделайте так, чтобы ваша база данных ломала индекс и требовала большого количества ЦП.

470
ответ дан 23 November 2019 в 02:28
поделиться

Когда мне пришлось это сделать, я нашел в Интернете следующий фрагмент:

 dateadd(dd,0, datediff(dd,0, YOURDATE))
 e.g.
 dateadd(dd,0, datediff(dd,0, getDate()))
7
ответ дан 23 November 2019 в 02:28
поделиться

Только для SQL Server 2008

CAST(@SomeDateTime AS Date) 

Затем верните его обратно в datetime, если хотите

CAST(CAST(@SomeDateTime AS Date) As datetime)
44
ответ дан 23 November 2019 в 02:28
поделиться

В SQl 2005 ваша функция trunc_date может быть написана вот так.

(1)

CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
    CAST(FLOOR( CAST( @date AS FLOAT ) )AS DATETIME)
END

Первый метод намного чище. Он использует только 3 вызова метода, включая последний CAST (), и не выполняет конкатенацию строк, что является автоматическим плюсом. Более того, здесь нет огромных типов. Если вы можете представить себе, что могут быть представлены метки даты и времени, тогда преобразование дат в числа и обратно в даты - довольно простой процесс.

(2)

CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
      SELECT CONVERT(varchar, @date,112)
END

Если вас беспокоит реализация даты и времени в Microsoft (2) или (3) может подойти

(3)

CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
SELECT CAST((STR( YEAR( @date ) ) + '/' +STR( MONTH( @date ) ) + '/' +STR( DAY(@date ) )
) AS DATETIME
END

В-третьих, более подробный метод. Для этого необходимо разбить дату на части года, месяца и дня, сложив их вместе в формате «гггг / мм / дд», затем вернем это к свиданию. Этот метод включает в себя 7 вызовов методов, включая последний CAST (), не говоря уже о конкатенации строк.

1
ответ дан 23 November 2019 в 02:28
поделиться
CONVERT(DATE, <yourdatetime>) or CONVERT(DATE, GetDate()) or CONVERT(DATE, CURRENT_TIMESTAMP)
1
ответ дан 23 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: