2013-07-11 3 views
-2

Какой должен быть ДЕНЬ МЕСЯЦА ГОДА в разделе where tsql?Какой должен быть порядок YEAR() MONTH() DAY() в разделе tsql where?

Select * from TABLE_NAME 
WHERE 
YEAR(COLUMN_NAME)=YEAR(GETDATE()) --1 
and DAY(COLUMN_NAME)=DAY(GETDATE()) --2 
and MONTH(COLUMN_NAME)=MONTH(GETDATE()) --3 

Выполняет ли заказ улучшение времени выполнения запроса? Как tsql выполняет это утверждение?

+4

Вы пытаетесь провести сравнение даты, игнорируя время? ; http://stackoverflow.com/questions/1427469/compare-dates-in-t-sql-ignoring-the-time-part; http://stackoverflow.com/questions/9308635/best-way-to-compare-dates-without-time-in-sql-server –

+1

Какую версию sqlserver вы используете? –

+0

sql server 2008. – Som

ответ

5

Если вы хотите улучшить производительность, то вы делаете это неправильно. Фильтры, которые вы используете, не будут использовать индекс (если он существует на COLUMN_NAME), потому что вы применяете к ним функцию. Правильный способ сделать это - сравнить эту колонку напрямую с GETDATE() (в этом случае). Это лучший способ:

SELECT * 
FROM TABLE_NAME 
WHERE COLUMN_NAME >= DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0) 
AND COLUMN_NAME < DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),1) 
+1

@ t-clausen.dk Нет, вы ошибаетесь. 'GETDATE()' будет оцениваться только один раз, и в этом запросе будет выполняться функция 'DATEADD()'. –

+2

@ t-clausen.dk, пожалуйста, найдите примеры. В любой ситуации, которую я видел, SQL Server достаточно умен, чтобы оценивать только GETDATE(), поэтому я не уверен, как это может привести к медленному запросу. –

+0

@ t-clausen.dk этого не осознавал. Исправлено сейчас, спасибо – Lamak