В основном существуют две ситуации, когда вызываются деструкторы: В стеке разматываются в конце функции (или при исключениях), если кто-то (или ссылочный счетчик) вызывает delete.
Одна особая ситуация которые могут быть найдены в статических объектах - они разрушаются в конце программы через at_exit, но это все еще вторая ситуация.
Какой сигнал выходит из__исхождения, может зависеть, kill -9 убьет процесс сразу же, другие сигналы будут сообщать ему о выходе, но как именно зависит от обратного вызова сигнала.
Строго говоря, метод a
является наименее ресурсоемким:
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Доказано, что при той же общей продолжительности миллиона строк кто-то из них потребляет меньше ресурсов ЦП. hands: Самый эффективный способ в SQL Server получить дату по дате + время?
Я видел аналогичный тест в другом месте с аналогичными результатами.
Я предпочитаю DATEADD / DATEDIFF, потому что:
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)
Лично я почти всегда использую определяемые пользователем функции для этого, если имею дело с 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. Этим способом,
См. Этот вопрос:
Как я могу усечь дату и время в SQL Server?
Что бы вы ни делали, не используйте строковый метод . Это наихудший способ сделать это.
Вот еще один ответ из другого повторяющегося вопроса:
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.
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.
В первую очередь убирать время при вставках / обновлениях. Что касается преобразования на лету, ничто не может превзойти пользовательскую функцию с точки зрения удобства обслуживания:
select date_only(dd)
Реализация date_only
может быть чем угодно - теперь она абстрагирована, и код вызова намного сложнее очиститель.
Уже отвечали, но я добавлю и это... это якобы тоже работает хорошо, но это работает, отбрасывая десятичную дробь (которая хранит время) из float и возвращая только целую часть (которая является датой)
CAST(
FLOOR( CAST( GETDATE() AS FLOAT ) )
AS DATETIME
)
второй раз я нашел это решение... я взял этот код