Лучший подход для удаления части времени datetime в SQL Server - PullRequest
499 голосов
/ 24 июля 2009

Какой метод обеспечивает наилучшую производительность при удалении части времени из поля даты и времени в SQL Server?

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

или

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

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

Оба также выглядят очень быстрыми, но может быть разница в скорости при работе с сотнями тысяч или более строк?

Кроме того, возможно ли, что есть еще лучшие способы избавиться от части времени datetime в SQL?

Ответы [ 23 ]

0 голосов
/ 24 июля 2009

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

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

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

Вот некоторые ссылки на различные функции UDF, связанные с датами:

Основные функции SQL Server Date, Time и DateTime
Функция Get Only Only

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

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

Конечно, абсолютный лучший подход для этогоиспользовать SQL Server 2008 (или выше) и выделять даты и времени , поскольку ядро ​​базы данных SQL Server изначально предоставляет отдельные компоненты даты и времени и может эффективно запрашивать их независимо без необходимостиUDF или другой механизм для извлечения части даты или времени из составного типа datetime.

0 голосов
/ 13 октября 2011

Если возможно, для особых вещей, подобных этому, мне нравится использовать функции CLR.

В этом случае:

[Microsoft.SqlServer.Server.SqlFunction]
    public static SqlDateTime DateOnly(SqlDateTime input)
    {
        if (!input.IsNull)
        {
            SqlDateTime dt = new SqlDateTime(input.Value.Year, input.Value.Month, input.Value.Day, 0, 0, 0);

            return dt;
        }
        else
            return SqlDateTime.Null;
    }
0 голосов
/ 19 декабря 2013

Я бы использовал:

CAST
(
CAST(YEAR(DATEFIELD) as varchar(4)) + '/' CAST(MM(DATEFIELD) as varchar(2)) + '/' CAST(DD(DATEFIELD) as varchar(2)) as datetime
) 

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

...