2016-11-08 7 views
3

У меня есть таблица SQL Server со следующими столбцами:месяц и год фильтр в SQL Server

SQL Table

Теперь я должен написать запрос, который будет возвращать мне записи, где «Месяц> Май» и " F Год> 2016 ".

Я предоставляю как «Месяц» (май) & «F Year» (2016) из моей заявки. Существует несколько записей с тем же месяцем & Значения столбцов года F.

Я пробовал с частью даты, в ролях и т. Д., Но не получал требуемого результата.

+0

* "Я пытался с датой части, Каст и т.д., но не получают необходимого результата . * * Пожалуйста, включите запрос, который вы t в вашем вопросе. –

+0

CAST ('+ Month +', '+ FYear' AS DATETIME)> CAST ('February 2017' AS DATETIME) – Vijay

+0

(DATEPART (MM, месяц)> DATEPART (ММ, 'февраль')) – Vijay

ответ

3

Вы можете сделать это (с названием месяца)

SELECT * 
FROM TableName 
WHERE DATEPART(MM, ([Month] + ' 01 2016')) > DATEPART(MM,'May' + ' 01 2016') 
    AND FYear > 2016 

или что (с номером месяца)

SELECT * 
FROM TableName 
WHERE DATEPART(MM, ([Month] + ' 01 2016')) > 5 
    AND FYear > 2016 
0

Попробуйте это: Это просто специфично для текущего требования

... 
FROM TableName 
WHERE [Month] NOT IN ('January','February','March','April') AND FYear >= 2016 
+0

OP сказал, что месяц поступает из приложения, но этот код не будет обрабатывать произвольную дату – mendosi

+0

@mendosi, вы правы. но я думаю, что вы не видели мой заголовок Ans, который делает вещь довольно очищенной. –

0
declare @month varchar(20)='may' 
set @month=left(@month,3) 
select * from tablename where CONVERT(varchar(3), CAST('Fmonth,Fyear' AS DATETIME), 100)>@month and year>2016 
+0

Привет, я не могу предоставить 5 запросов, так как у меня есть только имя месяца. – Vijay

+0

u можете попробовать этот – brahmareddy

0

Вы можете конвертировать ваши столбцы в дату, а затем сделайте сопоставление даты по мере необходимости.

Запрос

;WITH CTE as (
SELECT 2016 as FYear,'January' as Month 
UNION ALL SELECT 2016 as FYear,'February' as Month 
UNION ALL SELECT 2016 as FYear,'March' as Month 
UNION ALL SELECT 2016 as FYear,'April' as Month 
UNION ALL SELECT 2016 as FYear,'May' as Month 
UNION ALL SELECT 2016 as FYear,'June' as Month 
UNION ALL SELECT 2016 as FYear,'July' as Month 
UNION ALL SELECT 2016 as FYear,'August' as Month 
UNION ALL SELECT 2016 as FYear,'September' as Month 
UNION ALL SELECT 2016 as FYear,'October' as Month 
UNION ALL SELECT 2016 as FYear,'November' as Month 
UNION ALL SELECT 2016 as FYear,'December' as Month 
), CTE2 as (
SELECT *,CONVERT(DATE,'01 ' + LEFT(Month,3) + ' ' + CONVERT(VARCHAR(4),FYear),106) dt 
FROM CTE) 
SELECT * FROM CTE2 WHERE dt > '20160401'; 

Выход

FYear Month dt 
2016 May 2016-05-01 
2016 June 2016-06-01 
2016 July 2016-07-01 
2016 August 2016-08-01 
2016 September 2016-09-01 
2016 October 2016-10-01 
2016 November 2016-11-01 
2016 December 2016-12-01 
0

Использование ниже SQL:

select A.* 
from 
(
select 2016 FYear,'September' Month 
union 
select 2016 FYear,'October' Month 
union 
select 2016 FYear,'November' Month 
union 
select 2016 FYear,'December' Month 
union 
select 2016 FYear,'January' Month 
union 
select 2016 FYear,'Febraury' Month 
union 
select 2016 FYear,'March' Month 
) A 
inner join 
(
select 1 monthno,'January' MonthName 
union 
select 2 monthno,'February' MonthName 
union 
select 3 monthno,'March' MonthName 
union 
select 4 monthno,'April' MonthName 
union 
select 5 monthno,'May' MonthName 
union 
select 6 monthno,'June' MonthName 
union 
select 7 monthno,'July' MonthName 
union 
select 8 monthno,'August' MonthName 
union 
select 9 monthno,'September' MonthName 
union 
select 10 monthno,'October' MonthName 
union 
select 11 monthno,'November' MonthName 
union 
select 12 monthno,'December' MonthName 
) B on A.Month = B.MonthName 
WHERE A.FYear >= 2016 AND B.monthno >3 
Смежные вопросы