2013-09-11 3 views
-1
SELECT * FROM TABLE 
WHERE YEAR(MDTFlgtStart)=YEAR(GETDATE()) AND MONTH(MDTFlgtStart)=MONTH(GETDATE()) 

Над кодом он сравнивается с текущим годом и месяцем с годом и месяцем столбца. Но у нас есть шанс, мы можем дать год = 2012 год = 3 или год = 2011 год = 5Сравнение столбца datetime сервера SQL в год?

+0

Я ожидаю пропустить что-то очевидное, но заменим вызовы функций числовыми литералами, например. '... ГДЕ ГОД (MDTFlgtStart) = 2011 И МЕСЯЦ (MDTFlgtStart) = 5'. – collapsar

ответ

1

Вы можете объявить переменные:

DECLARE @YEAR AS INT 
DECLARE @MONTH AS INT 

SET @YEAR = 2012 
SET @MONTH = 3 

SELECT * 
FROM TABLE 
WHERE YEAR(MDTFlgtStart)[email protected] AND MONTH(MDTFlgtStart)[email protected] 

Вы можете обернуть выше в процедуре повторного - полезность ....

1

Вы можете просто использовать параметры для этих значений. В качестве бонуса, avoiding functions against the column will help assist a seek if an index exists on the column (конечно SELECT * means it will likely end up as a full scan anyway, or a range scan and a bunch of lookups) ...

-- these would be input parameters for your stored procedure 
DECLARE @y INT = 2011, @m INT = 5; 


-- now have a date variable: 
DECLARE @dt DATE = DATEADD(MONTH, @m-1, DATEADD(YEAR, @y-1900, 0)); 

SELECT ... FROM dbo.tablename 
    WHERE MDTFlgtStart >= @dt 
    AND MDTFlgtStart < DATEADD(MONTH, 1, @dt); 

Кроме того, вы должны прекратить приглашать кто назвал эти колонны на обед, потому что я должен предположить, что они не очень хорошо.

Смежные вопросы