Как вернуть значения следующего года, когда вы находитесь в текущем году, но сохранить текущие значения при переключении на следующий год? который становится текущим годом - PullRequest
1 голос
/ 15 октября 2019

У меня есть представление, при котором пользователь выбирает определенный месяц. Он возвращает различные значения на основе выбора месяца. Использование MS SQL Server

Проблема. Возвращает эти значения в зависимости от месяца и работает в обычном режиме до тех пор, пока пользователь не выберет январь. Когда выбран январь, он возвращает как текущий год (который уже прошел), так и предстоящий январь (январь 2020 года. Именно этого они и хотят). Как удалить значения 2019 при выборе следующего года, но также сохранить их, когда год изменится на следующий год?

Вот запрос

SELECT distinct 
       RRP.Id, RRP.UniqClient, RRP.Client, RRP.Expiring_Policies, RRP.UniqBroker, 
       CONVERT(varchar, RRP.ExpDate, 101) AS ExpDate, RRP.NewUw, RRP.OtherContact, 
       RRP.Company, RRP.Broker_Name, RRP.Reviewed, RRP.DateCreated, RRP.DateUpdated, 
       RRP.EmailCreated, RRP.UniqProducer, RRP.LINES, 
  CASE WHEN MMS.UniqMarketingSubmission IS NULL THEN 'No' ELSE 'Yes' END AS [MMS Created]
  FROM  dbo.Reviewed_Renewal_Policy AS RRP LEFT OUTER JOIN
  GREEN43_PROD_REPL.dbo.MarketingSubmission AS MMS ON RRP.UniqClient = MMS.UniqEntity AND RRP.ExpDate = MMS.EffectiveDate 

  where (RRP.Reviewed = 'No') AND (DATENAME(month, RRP.ExpDate) = DATENAME(MONTH, DATEADD(Month, 3, GETDATE()))) 

  order by ExpDate ASC

Обычно в DATEADD вместо 3 в переменной DATEADD используется переменная веб-форм .NET, но 3 работает в SQL, и я сохранил ее для ясности

Я пробовал возиться со сравнением текущих дат и добавлением года, но пока ничего не получилось. В очередной раз благодарим за помощь.

Ответы [ 4 ]

0 голосов
/ 15 октября 2019

Просто как пример того, насколько проще читать отформатированный sql. Я взял опубликованный ответ ОП и немного его отформатировал. Удалил несколько дополнительных наборов скобок и переместил немного логики, чтобы было немного проще.

SELECT distinct RRP.Id
    , RRP.UniqClient
    , RRP.Client
    , RRP.Expiring_Policies
    , RRP.UniqBroker
    , CONVERT(varchar, RRP.ExpDate, 101) AS ExpDate
    , RRP.NewUw
    , RRP.OtherContact
    , RRP.Company
    , RRP.Broker_Name
    , RRP.Reviewed
    , RRP.DateCreated
    , RRP.DateUpdated
    , RRP.EmailCreated
    , RRP.UniqProducer
    , RRP.LINES
    , CASE WHEN MMS.UniqMarketingSubmission IS NULL THEN 'No' ELSE 'Yes' END AS [MMS Created]
FROM  dbo.Reviewed_Renewal_Policy AS RRP 
LEFT OUTER JOIN GREEN43_PROD_REPL.dbo.MarketingSubmission AS MMS ON RRP.UniqClient = MMS.UniqEntity 
                                                                AND RRP.ExpDate = MMS.EffectiveDate 
where RRP.Reviewed = 'No'
AND DATENAME(month, RRP.ExpDate) = DATENAME(MONTH, DATEADD(Month, 4, GETDATE()))
AND
(
    Month(getdate()) <= Month(RRP.ExpDate)
) 
OR
(
    Month(getdate()) > Month(RRP.ExpDate) 
    AND 
    Year(RRP.ExpDate) > Year(getdate())
) 
order by ExpDate ASC
0 голосов
/ 15 октября 2019

Если вы хотите получить значение в течение трех месяцев в будущем, я бы посоветовал:

where RRP.Reviewed = 'No' and
      RRP.ExpDate >= datefromparts(year(dateadd(month, 3, getdate()),
                                   month(dateadd(month, 3, getdate()),
                                   1) and
      RRP.ExpDate < datefromparts(year(dateadd(month, 4, getdate()),
                                   month(dateadd(month, 4, getdate()),
                                   1) 

Примечание. Это построено таким образом, чтобы можно было использовать индекс для (Reviewed, ExpDate) или (ExpDate). * 1006. *

0 голосов
/ 15 октября 2019

Цените помощь, которую мне оказали. Мне удалось ответить на мой собственный вопрос. Я нашел пример этого решения из другого вопроса. Я изменил это, чтобы соответствовать моему собственному.

SELECT distinct  
           RRP.Id, RRP.UniqClient, RRP.Client, RRP.Expiring_Policies, RRP.UniqBroker, CONVERT(varchar, RRP.ExpDate, 101) AS ExpDate, 
            RRP.NewUw, RRP.OtherContact, RRP.Company, RRP.Broker_Name, RRP.Reviewed, RRP.DateCreated, 
            RRP.DateUpdated, RRP.EmailCreated, RRP.UniqProducer, RRP.LINES, CASE WHEN MMS.UniqMarketingSubmission IS NULL THEN 'No' ELSE 'Yes' END AS [MMS Created]

            FROM  dbo.Reviewed_Renewal_Policy AS RRP LEFT OUTER JOIN
            GREEN43_PROD_REPL.dbo.MarketingSubmission AS MMS ON RRP.UniqClient = MMS.UniqEntity AND RRP.ExpDate = MMS.EffectiveDate 

     where ((RRP.Reviewed = 'No') AND (DATENAME(month, RRP.ExpDate) = DATENAME(MONTH, DATEADD(Month, 4, GETDATE()))) 
            AND Month(getdate()) <= Month(RRP.ExpDate)) 
            OR
            ((RRP.Reviewed = 'No') AND (DATENAME(month, RRP.ExpDate) = DATENAME(MONTH, DATEADD(Month, 4, GETDATE()))) 
            AND Month(getdate()) > Month(RRP.ExpDate) AND Year(RRP.ExpDate) > Year(getdate())) 
            order by ExpDate ASC

Возвращает значения текущего года и значения следующего года, когда сделан соответствующий выбор.

ИЛИ Альтернатива благодаря Гордону Линоффу выше

SELECT distinct  
            RRP.Id, RRP.UniqClient, RRP.Client, RRP.Expiring_Policies, RRP.UniqBroker, CONVERT(varchar, RRP.ExpDate, 101) AS ExpDate, 
            RRP.NewUw, RRP.OtherContact, RRP.Company, RRP.Broker_Name, RRP.Reviewed, RRP.DateCreated, 
            RRP.DateUpdated, RRP.EmailCreated, RRP.UniqProducer, RRP.LINES, CASE WHEN MMS.UniqMarketingSubmission IS NULL THEN 'No' ELSE 'Yes' END AS [MMS Created]

            FROM  dbo.Reviewed_Renewal_Policy AS RRP LEFT OUTER JOIN
            GREEN43_PROD_REPL.dbo.MarketingSubmission AS MMS ON RRP.UniqClient = MMS.UniqEntity AND RRP.ExpDate = MMS.EffectiveDate 
    where ((RRP.Reviewed = 'No') AND (DATENAME(month, RRP.ExpDate) = DATENAME(MONTH, DATEADD(Month, 3, GETDATE()))) 
            AND Month(getdate()) <= Month(RRP.ExpDate)) 
            OR
            ((RRP.Reviewed = 'No') AND (DATENAME(month, RRP.ExpDate) = DATENAME(MONTH, DATEADD(Month, 3, GETDATE()))) AND
            datefromparts(1 + year(getdate()), 1, 1) <= RRP.ExpDate and datefromparts(1 + year(getdate()), 2, 1) >= RRP.ExpDate) 
            order by ExpDate ASC 
0 голосов
/ 15 октября 2019

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

AND YEAR(RRP.ExpDate) = YEAR(GETDATE())

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...