2015-09-10 2 views
0

У меня есть процедура, в которой пользователь вводит месяц, например, «JAN», чтобы извлечь данные за этот месяц. Я хочу сравнить входной месяц с месячной частью в дате. Это то, что я получил до сих пор.Извлечь месяц номер?

CREATE PROCEDURE SavingsAccountsAllDetail 
(@Yr INT=NULL, 
@Mon CHAR(3)=NULL) 

AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @Year INT 
    DECLARE @Month CHAR(3) 

    SET @Year = @Yr 
    SET @Month = @Mon 

и сравнение часть.

datepart(year, A.DateOpen)[email protected] AND datepart(month, A.DateOpen)=datepart(MM, @Month) 

Но когда я выполняю свою процедуру он говорит

Конверсия удалось при преобразовании даты и/или времени из символьной строки . Степень серьезности 16

Любая идея о том, как действовать?

ответ

1

Вы используете DATEPART но передавая ему свою собственность под названием @Mon, который является CHAR(3), он не может преобразовать это CHAR(3) в Date, следовательно, ошибка.

Ваш параметр @Mon должен быть Int как @Yr и ваш запрос будет

datepart(year, A.DateOpen)[email protected] AND datepart(month, A.DateOpen) = @Month 
+0

Я хочу, чтобы пользователи вводили месяц в формате i.e 'JAN'. Как сравнить это с месячной частью даты? –

+0

Затем проверьте ответ Правина, это именно то, что вы пытаетесь сделать. Просто будьте осторожны с тем, что он может работать некорректно в зависимости от языкового стандарта компьютера (он может вернуть Janvier, если язык является французским, например), и, вероятно, это безопаснее с точки зрения кода для использования номера месяца. – Gimly

0

Вместо datepart использование datename, он теперь будет возвращать вам имя месяца вместо индекса месяца (то есть, 12 за декабрь)

Тогда получим для первых трех букв возвращенного месяца сравнить с вами входной строкой

Используйте это для сравнения

datepart(year, A.DateOpen)[email protected] AND left(datename(month, A.DateOpen),3)[email protected] 
1

Ваши @Year и @Month переменными являются не даты. Это строковые представления частей даты.

При извлечении dateparts из A.DateOpen вы можете непосредственно сравнить, что эти переменные:

datepart(year, A.DateOpen)[email protected] AND datepart(month, A.DateOpen)[email protected] 

Однако datepart возвращает числовое значение, и вы хотите, чтобы сравнить текст (например, «ЯН»). Рассмотрим добавление 'DateName() функцию, и изменив строку на:

datepart(year, A.DateOpen)[email protected] AND left(datename(month, A.DateOpen), 3)[email protected] 
+0

Perfect .. Thanx ... –

+0

Только что заметил, что когда-либо использовавшееся время показывает только месяц JAN. Попробуйте следующее: SELECT datepart (год, '26.04.2013 12:00:00 AM'), left (дата (месяц, датаpart (месяц, '26.04.2013 12:00:00 AM)), 3) –

+0

@DeEDEe Вы правы; Я случайно оставил 'DatePart()' там ... Последняя инструкция изменилась, теперь она должна работать. – steenbergh

0

пожалуйста, попробуйте это как запрос

DECLARE @inpMonth CHAR(3) = 'SEP' 
SELECT CASE WHEN @inpMonth = FORMAT(GETDATE(),'MMM') THEN 1 ELSE 0 END AS [res] 

я использую в SQL SERVER 2012

0

вы получаете сообщение об ошибке от

datepart(month, A.DateOpen)=datepart(MM, @Month) 

, как @Month может иметь значение Jan, Feb и т. Д., Который sql server не смог преобразовать в соответствующую дату.

Присвоить правильное значение @month от @Mon like;

DECLARE @Month int 
select @Month = 
    case @Mon 
    when 'Jan' then 1 
    when 'Feb' then 2 
    when 'Mar' then 3 
    when 'Apr' then 4 
    when 'May' then 5 
    when 'Jun' then 6 
    when 'Jul' then 7 
    when 'Aug' then 8 
    when 'Sep' then 9 
    when 'Oct' then 10 
    when 'Nov' then 11 
    when 'Dec' then 12 
    else 0 
end 

и использовать @month в запросе типа;

datepart(year, A.DateOpen) = @Year AND datepart(month, A.DateOpen) = @Month 
Смежные вопросы