2015-08-06 5 views
1

У меня есть таблица, которая имеет место Процентной ресурсов, имеющих UserId, дата вступления в силу (тип данных Дата) & Дата окончания (тип данных Дата)Выберите запись по диапазону дат в SQL Server

RateId UserId Rate  EffectiveDate   EndDate 
============================================================================ 
21 169 82 2015-01-01 00:00:00.000 2025-12-30 00:00:00.000 
23 78 58 2015-07-01 00:00:00.000 2015-07-14 00:00:00.000 
24 88 68 2015-07-01 00:00:00.000 2025-12-30 00:00:00.000 
25 114 78 2015-07-01 00:00:00.000 2025-12-30 00:00:00.000 
26 218 56 2015-07-01 00:00:00.000 2025-12-30 00:00:00.000 
27 78 89 2015-07-15 00:00:00.000 2025-12-30 00:00:00.000 
28 174 69 2015-01-01 00:00:00.000 2015-08-14 00:00:00.000 
29 174 59 2015-08-15 00:00:00.000 2025-12-30 00:00:00.000 
30 235 65 2015-01-01 00:00:00.000 2015-08-14 00:00:00.000 
31 235 84 2015-08-15 00:00:00.000 2025-12-30 00:00:00.000 
32 234 49 2015-08-01 00:00:00.000 2015-08-14 00:00:00.000 
33 234 59 2015-08-15 00:00:00.000 2025-12-30 00:00:00.000 
34 303 89 2014-10-01 00:00:00.000 2015-08-14 00:00:00.000 
35 303 75 2015-08-15 00:00:00.000 2025-12-30 00:00:00.000 
36 481 84 2015-01-01 00:00:00.000 2025-12-30 00:00:00.000 

нужно выбрать ставки для тех, только для пользователя, чья ставка падает только на диапазон текущего месяца (между датой начала & Конечная дата месяца).

Это то, что я пробовал до сих пор.

DECLARE @MONTH INT 
DECLARE @YEAR INT 
DECLARE @STARTDATEOFMONTH DATE 
DECLARE @LASTDATEOFMONTH DATE 
SET @MONTH = 8 /*Current Month*/ 
SET @YEAR = 2015 /*Current Year*/ 
SET @STARTDATEOFMONTH = DATEADD(MONTH,@MONTH-1,DATEADD(YEAR,@YEAR-1900,0)) /*FIRST*/ 
SET @LASTDATEOFMONTH = DATEADD(DAY,-1,DATEADD(MONTH,@MONTH,DATEADD(YEAR,@YEAR-1900,0))) /*LAST*/ 

SELECT * FROM TRNS_RATE_DETAILS 
    WHERE @STARTDATEOFMONTH >= EFFECTIVEDATE 
    AND @LASTDATEOFMONTH <= ENDDATE 

Я расчета Дата начала и Дата окончания каждого месяца (например, в приведенном выше запросе я прошел текущий месяц = ​​8 & год = 2015)

выход запроса является

RateId UserId Rate  EffectiveDate   EndDate 
============================================================================ 
21 169 82 2015-01-01 00:00:00.000 2025-12-30 00:00:00.000 
24 88 68 2015-07-01 00:00:00.000 2025-12-30 00:00:00.000 
25 114 78 2015-07-01 00:00:00.000 2025-12-30 00:00:00.000 
26 218 56 2015-07-01 00:00:00.000 2025-12-30 00:00:00.000 
27 78 89 2015-07-15 00:00:00.000 2025-12-30 00:00:00.000 
36 481 84 2015-01-01 00:00:00.000 2025-12-30 00:00:00.000 

Как вы можете видеть, я могу получить только те записи, которые появляются до начала даты текущего месяца & после последней даты текущего месяца.

Мне нужно получить те записи, чья дата вступления в силу & Дата окончания между датой начала & Конечная дата каждого месяца.

Скажите, у меня есть тариф = 45 для ресурса (UserId) для даты между 1 января-2015 годами (Дата вступления в силу) до 14 августа (дата окончания) и другая ставка = 75 для даты между 15 августа 2015 года (эффективная Дата) до 30 декабря 2025 года (Дата окончания)

Так что я действительно хочу обе цены (45 & 75) за тот же ресурс за месяц с августа 2015 года?

Пожалуйста, помогите мне!

Спасибо!

+0

Зачем вам нужен последний день текущего месяц? Подумайте об этом по-другому - вы хотите> = первый день текущего месяца и <первый день следующего месяца. Не запрос, который решает ваш вопрос, а определенно более простой способ рассчитать ваш диапазон. –

+0

Вы хотите текущий месяц (т. Е. Август) или 30-дневный период? –

+0

@AaronBertrand Скажите одному пользователю, что у меня есть только один курс с 1 января, 15 до 1 декабря, 15, но для другого пользователя у меня есть два тарифа: один из 1 ян, 15-14 августа, 15 и второй - с 15 августа, 15 - 31 декабря, 15 Может ли предложение ur работать в этом случае? –

ответ

1

Если вы просто хотите использовать текущий месяц, вы можете использовать DATEPART и GETDATE:

SELECT * FROM TRNS_RATE_DETAILS 
    WHERE 
    (
    (DATEPART(month,EFFECTIVEDATE) <= DATEPART(month,GETDATE()) 
    AND DATEPART(year,EFFECTIVEDATE) = DATEPART(year,GETDATE())) 
    OR 
    DATEPART(year,EFFECTIVEDATE) < DATEPART(year,GETDATE()) 
    ) 
    AND 
    (
    (DATEPART(month,ENDDATE) >= DATEPART(month,GETDATE()) 
    AND DATEPART(year,ENDDATE) = DATEPART(year,GETDATE())) 
    OR 
    DATEPART(year,ENDDATE) > DATEPART(year,GETDATE()) 
) 
+0

Я запустил ур-запрос, и я получил только те записи, которые вступили в силу в августе, только о тех, чья эффективная дата - янв. 15, а дата окончания - 15 декабря. Разве это тоже не выпадает на август? –

+0

@ VinaySinha См. Правки –

+0

Отличный человек, он работает :) –

0

Вы хотите EFFECTIVEDATE между startdate и lastdate ... но вы на самом деле попросите db для записи, имеющей начальную дату, большую, чем эффективная дата ..., которая является противоположностью, которую вы хотите.

попробовать:

SELECT * FROM TRNS_RATE_DETAILS 
    WHERE EFFECTIVEDATE >= @STARTDATEOFMONTH 
AND ENDDATE <[email protected] 

Btw, способ не просто проверить в течение месяца с помощью функции экстракта?

+0

Потому что некоторые из месяцев имеют два разных значения. –

0

Может быть, это поможет вам:

SELECT * 
FROM TRNS_RATE_DETAILS 
WHERE (MONTH(EFFECTIVEDATE) = @MONTH AND YEAR(EFFECTIVEDATE) = @YEAR) 
OR  (MONTH(ENDDATE)   = @MONTH AND YEAR(ENDDATE)  = @YEAR) 
+0

Спасибо за ответ ур, но ваш запрос дает только те записи, чья дата вступления в силу и дата окончания выпадают в текущем месяце, но мне также нужны те записи, чья дата вступления в силу 1 января 2015 и дата окончания 30 декабря 2025 (август, 2015 и падает между этими диапазон дат) –

+0

Привет Вини, просто попробуйте это, SELECT * FROM TRNS_RATE_DETAILS ГДЕ (YEAR (EFFECTIVEDATE) = @YEAR) ИЛИ (YEAR (ENDDATE) = @YEAR) – vipin

+0

если вы хотите оба, используйте это .................. SELECT * FROM TRNS_RATE_DETAILS ГДЕ (ГОД (ЭФФЕКТИВНОЕ) = @YEAR) И (ГОД (ENDDATE) = @YEAR) – vipin

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