2012-03-06 2 views
0

Как сравнить переменную datetime, переданную в процедуру хранилища с переменной datetime в таблице.Сравнение переменных datetime

например. В моем где значение положение @paramDate является 2/10/2012

set sql = 'WHERE product.RegisteredDate >= ' + @paramDate 

когда я EXEC (@sql)

это не удается, ошибка:

Conversion failed when converting datetime from character string. 

Thx

+1

Вы можете вставить реальный код. У фрагментов у вас нет смысла. – Khan

ответ

3
SET @sql = '... WHERE product.RegisteredDate >= ''' 
    + CONVERT(CHAR(8), @paramDate, 112) + ''';'; 

Если @ParamDate является NULL вы, вероятно, может сделать это:

SET @sql = 'SELECT ...'; 

SET @sql = @sql + COALESCE(' WHERE product.RegisteredDate >= ''' 
    + CONVERT(CHAR(8), @paramDate, 112) + ''';', ''); 

Или даже:

SET @sql = 'SELECT ...'; 

IF @paramDate IS NOT NULL 
BEGIN 
    SET @sql = @sql + '... WHERE product.RegisteredDate >= ''' 
     + CONVERT(CHAR(8), @paramDate, 112) + ''';'; 
END 
+0

Thx Aaron, ваш синтаксис работал, не могли бы вы объяснить мне, что делает конвертер? CONVERT (CHAR (10), @paramDate, 112)? что такое char (10)? 112? спасибо – Ben

+0

'CHAR' - тип данных. '10' - 10 символов. '112' - это стиль,' YYYYMMDD'. Чтобы узнать, что он делает, вы можете сказать 'SELECT CONVERT (CHAR (10), GETDATE(), 112);'. И подумайте об этом, это должно быть «CHAR (8)» (меня всегда путают между 112 и 120 («ГГГГ-ММ-ДД»). –

+1

thx alot, не уверен, должен ли я открыть новый билет, но Мне было интересно, передается ли значение NULL в sp, как пропустить преобразование? – Ben

2

Попробуйте это :

CONVERT(varchar, @paramDate, 101) 

См. Здесь для получения дополнительной информации основ уверены, верны: http://msdn.microsoft.com/en-us/library/ms187928.aspx

+0

Это не поможет, поскольку проблема заключается в том, что значение даты должно иметь ограничитель строк вокруг него. 101 не является безопасным форматом для использования в любом случае (это 10 февраля или 2 октября?), И вы должны ВСЕГДА указывать длину при преобразовании в char/varchar и т. Д. –

+0

А, я взял 10 февраля, поскольку это было ближе к сегодняшнему дню. Моя вина. –

0

Поскольку вы пытаетесь выполнить динамический запрос, может использовать sp_executesql вместо exec, чтобы вы могли использовать параметры в сгенерированном запросе. Вот подробности для sp_executesql.

Например:

set @sql = 'WHERE product.RegisteredDate >= @dynamicParm' 

EXECUTE sp_executesql @sql, N'@dynamicParm DATETIME', @dynamicParm = @paramDate