Я, лично, почти всегда использую User Defined functions для этого, если имеет дело с SQL Server 2005 (или более низкой версией), однако, следует отметить, что есть определенные недостатки в использовании UDF, особенно если применять их в WHERE (см. ниже и комментарии к этому ответу для получения дополнительной информации). Если используется SQL Server 2008 (или выше) - см. Ниже.
На самом деле, для большинства баз данных, которые я создаю, я добавляю эти UDF прямо в начале, так как я знаю, что есть шанс на 99%, который мне понадобится рано или поздно.
Я создаю один для «только даты» & «только время» (хотя «дата только» одна из них является наиболее используемой из двух).
Вот некоторые ссылки на различных даты, связанные с ОДС:
Essential SQL Server Date, Time and DateTime Functions
Get Date Only Function
Это последнее звено не показывает не менее 3-х различных способов для получения даты только часть поля даты и времени и упоминает некоторые плюсы и минусы каждого подхода.
При использовании UDF следует отметить, что вы должны стараться избегать использования UDF как части предложения WHERE в запросе, поскольку это значительно затруднит выполнение запроса. Основная причина этого заключается в том, что использование UDF в предложении WHERE делает это предложение как non-sargable, что означает, что SQL Server больше не может использовать индекс с этим предложением, чтобы повысить скорость выполнения запроса. Что касается моего собственного использования UDF, я часто использую столбец «raw» date в предложении WHERE, но применяю UDF к столбцу SELECTed. Таким образом, UDF применяется только к фильтруемому набору результатов, а не к каждой строке таблицы как части фильтра.
Конечно, абсолютное лучший подход заключается в использовании SQL Server 2008 (или выше) и разделить ваши dates and times, как ядро базы данных SQL Server, затем изначально предоставления отдельных компонентах даты и времени, а может эффективно запрашивать их самостоятельно, без необходимости использования UDF или другого механизма для извлечения либо даты, либо временной части из составного типа datetime.
Я пробовал это на миллион записей в одной из моих производственных таблиц, и я не мог точно узнать о производительности в любом случае. Однако оба метода вернули то же количество данных. –
Обработка строк - это больше процессорного процесса. DATEADD и DATEDIFF предназначены для наилучшего использования представления хранилища, используемого SQL Server. – MatBailie
На 18 000 000 строк это то, что я нашел (SQL Server 2008): метод b примерно на 24% медленнее, чем метод a. CAST (FLOOR (CAST (getdate() AS FLOAT)) AS DATETIME) на 3,5% медленнее, чем метод a. Метод a, по-видимому, является победителем в отношении производительности. Спасибо всем за отличные ответы. –