Лучший подход для удаления части времени datetime в SQL Server

В основном существуют две ситуации, когда вызываются деструкторы: В стеке разматываются в конце функции (или при исключениях), если кто-то (или ссылочный счетчик) вызывает delete.

Одна особая ситуация которые могут быть найдены в статических объектах - они разрушаются в конце программы через at_exit, но это все еще вторая ситуация.

Какой сигнал выходит из__исхождения, может зависеть, kill -9 убьет процесс сразу же, другие сигналы будут сообщать ему о выходе, но как именно зависит от обратного вызова сигнала.

489
задан gbn 12 July 2011 в 06:51
поделиться

7 ответов

Строго говоря, метод a является наименее ресурсоемким:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

Доказано, что при той же общей продолжительности миллиона строк кто-то из них потребляет меньше ресурсов ЦП. hands: Самый эффективный способ в SQL Server получить дату по дате + время?

Я видел аналогичный тест в другом месте с аналогичными результатами.

Я предпочитаю DATEADD / DATEDIFF, потому что:

  • varchar подлежит к проблемам с языком / форматом даты
    Example: Why is my CASE expression non-deterministic?
  • float relies on internal storage
  • it extends to work out first day of month, tomorrow etc by changing "0" base

Edit, Oct 2011

For SQL Server 2008+, you can CAST to date. Or just use date so no time to remove.

Edit, Jan 2012

A worked example of how flexible this is: Need to calculate by rounded time or date figure in sql server

Edit, May 2012

Do not use this in WHERE clauses and the like without thinking: adding a function or CAST to a column invalidates index usage. See number 2 here: http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

Now, this does have an example of later SQL Server optimiser versions managing CAST to date correctly, but generally it will be a bad idea ...

Edit, Sep 2018, for datetime2

DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)
537
ответ дан 22 November 2019 в 22:37
поделиться

Лично я почти всегда использую определяемые пользователем функции для этого, если имею дело с SQL Server 2005 (или более ранней версией), однако следует отметить, что существуют определенные недостатки использования UDF, особенно если применять их к предложениям WHERE (см. ниже и комментарии к этому ответу для получения дополнительной информации). При использовании SQL Server 2008 (или выше) - см. Ниже.

Фактически, для большинства создаваемых мной баз данных я добавляю эти UDF прямо в самом начале, так как я знаю, что с вероятностью 99% они мне понадобятся. рано или поздно.

Я создаю один для "только дата" и "только время" (хотя один "только дата" является наиболее часто используемым из двух).

Вот несколько ссылок на различные даты -связанные UDF:

Essential SQL Server Date, Функции времени и даты и времени
Функция получения только даты

Эта последняя ссылка показывает не менее 3 различных способов получения даты только из части поля datetime и упоминает некоторые плюсы и минусы каждого подхода.

При использовании UDF, следует отметить, что вы должны стараться избегать использования UDF как части предложения WHERE в запросе, поскольку это значительно снизит производительность запроса. Основная причина этого заключается в том, что использование UDF в предложении WHERE отображает это предложение как non-sargable , что означает, что SQL Server больше не может использовать индекс с этим предложением, чтобы повысить скорость запроса. исполнение. Что касается моего собственного использования UDF, я часто использую «необработанный» столбец даты в предложении WHERE, но применяю UDF к столбцу SELECTed. Этим способом,

0
ответ дан 22 November 2019 в 22:37
поделиться

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

Что бы вы ни делали, не используйте строковый метод . Это наихудший способ сделать это.

2
ответ дан 22 November 2019 в 22:37
поделиться

Вот еще один ответ из другого повторяющегося вопроса:

SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime) 

Этот метод магических чисел работает немного быстрее, чем метод DATEADD. (Похоже, ~ 10%)

Процессорное время на нескольких раундах из миллиона записей:

DATEADD   MAGIC FLOAT
500       453
453       360
375       375
406       360

Но обратите внимание, что эти числа, возможно, не имеют значения, потому что они и так ОЧЕНЬ быстрые. Если бы у меня не было наборов записей в 100 000 или более, я не мог бы даже заставить CPU Time читать выше нуля.

Учитывая тот факт, что DateAdd предназначен для этой цели и является более надежным, я бы сказал, что используйте DateAdd.

8
ответ дан 22 November 2019 в 22:37
поделиться
SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

...is not a good solution, per the comments below.

I would delete this answer, but I'll leave it here as a counter-example since I think the commenters' explanation of why it's not a good idea is still useful.

21
ответ дан 22 November 2019 в 22:37
поделиться

В первую очередь убирать время при вставках / обновлениях. Что касается преобразования на лету, ничто не может превзойти пользовательскую функцию с точки зрения удобства обслуживания:

select date_only(dd)

Реализация date_only может быть чем угодно - теперь она абстрагирована, и код вызова намного сложнее очиститель.

2
ответ дан 22 November 2019 в 22:37
поделиться

Уже отвечали, но я добавлю и это... это якобы тоже работает хорошо, но это работает, отбрасывая десятичную дробь (которая хранит время) из float и возвращая только целую часть (которая является датой)

 CAST(
FLOOR( CAST( GETDATE() AS FLOAT ) )
AS DATETIME
)

второй раз я нашел это решение... я взял этот код

2
ответ дан 22 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

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