Как установить диапазон дат для 2 повторяющихся дней в неделю в течение 2 или 3 месяцев в SQL? - PullRequest
2 голосов
/ 01 ноября 2010

Я работаю в Microsoft SQL Server 2005, и мне нужно провести анализ игроков, которые будут участвовать в нашем турнире 50+ по вторникам -> Чтобы пройти, им нужно набрать 5+ очков в понедельник или вторник на этой неделе до 14:00. , и очки не накапливаются (должны быть минимум 5 в понедельник или вторник до 14:00). Код, который я использую, приведен ниже, но пока содержит только диапазон дат для определенного понедельника и вторника. Мне нужны все понедельники и вторники в течение 2 месяцев. Я новичок в этом (своего рода брошенный мне на колени в качестве дополнительной обязанности, поэтому я должен учиться на лету) ...

До сих пор, как я уже говорил, я был в состоянии самостоятельно преуспеть в получении всей необходимой мне информации, но она относится только к 1 неделе. Все, что я нашел в Интернете до сих пор, было более запутанным, чем я могу объяснить, и никто не ссылался на код, который я предоставил, вместо этого давая мне совершенно новый код, который я не могу использовать ...

SELECT     
     dbo.CombinedPts.Account, dbo.CombinedPts.FirstName, 
     dbo.CombinedPts.LastName, 
     ISNULL(dbo.CombinedPts.EGSPts, 0) AS EGS, 
     ISNULL(dbo.CombinedPts.IRPts, 0) AS IR, 
     DATENAME(dw, dbo.CombinedPts.Date) AS WkDay, 
     DATEDIFF(YY, dbo.PlayerMaster.Birthdate, {fn current_date()}) - CASE WHEN   (MONTH(dbo.PlayerMaster.Birthdate)=MONTH({fn current_date()}) AND DAY(dbo.PlayerMaster.Birthdate) > DAY({fn current_date()}) OR MONTH (dbo.PlayerMaster.Birthdate) > MONTH ({fn current_date()}))  THEN 1   ELSE 0   END   AS Age
FROM       
     dbo.CombinedPts, dbo.PlayerMaster 
WHERE      
     (DATEDIFF(YY, dbo.PlayerMaster.Birthdate, {fn current_date()}) >= 50) 
     AND (dbo.CombinedPts.EGSPts >= 5 OR dbo.CombinedPts.IRPts >= 5) 
     AND (dbo.CombinedPts.Account = dbo.PlayerMaster.Account) 
     AND (Date BETWEEN '10/11/2010 00:00:00' AND '10/11/2010 13:59:59' OR Date BETWEEN '10/12/2010 00:00:00' AND '10/12/2010 13:59:59') 
     AND (DATEPART(dw, dbo.CombinedPts.Date) = 2 OR DATEPART(dw, dbo.CombinedPts.Date) = 3)
GROUP BY   
     dbo.CombinedPts.Account, 
     dbo.CombinedPts.FirstName, 
     dbo.CombinedPts.LastName, 
     DATENAME(dw, dbo.CombinedPts.Date), 
     dbo.CombinedPts.EGSPts, 
     dbo.CombinedPts.IRPts, 
     dbo.PlayerMaster.Birthdate
ORDER BY
     dbo.CombinedPts.Account

В качестве примечания, в нашем SQL Server 2005 у меня нет разрешений на создание подзапросов (я стал заядлым пользователем UNION ALL ->, который до сих пор бесполезен в запросе), и при этом у меня нет разрешения для генерации таблиц, поэтому все, что я делаю, должно быть в одном запросе ... И до сих пор вся помощь, которая имела смысл, заключалась в использовании таблиц и подзапросов.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2010

Это немного другая структура, но в основном такая же. Я использовал псевдонимы вместо полных ссылок. Это также не проверено, но анализирует чисто.

AND DATEDIFF(m,cp.Date,GETDATE()) < 2 дает вам окно на 2 месяца.

РЕДАКТИРОВАТЬ - Добавлены пункты для дня и времени. AND (DATEPART(dw, cp.Date) in (2,3) AND DATEPART(hh,cp.Date) > 14) дает вам только понедельник и вторник после 14:00 (14:00)

SELECT cp.Account
, cp.FirstName
, cp.LastName
, ISNULL(cp.EGSPts,0) AS EGS
, ISNULL(cp.IRPts,0) AS IR
, DATENAME(dw, cp.Date) AS WkDay
, DATEDIFF(YY, pm.Birthdate, GETDATE()) 
        - CASE WHEN (MONTH(pm.Birthdate) = MONTH(GETDATE()) 
        AND DAY(pm.Birthdate) > DAY(GETDATE()) 
        OR MONTH (pm.Birthdate) > MONTH (GETDATE()) )
        THEN 1 
        ELSE 0 
        END AS Age

FROM dbo.CombinedPts cp
join dbo.PlayerMaster pm on cp.Account = pm.Account

WHERE DATEDIFF(YY, pm.Birthdate, GETDATE()) >= 50
 AND (cp.EGSPts >= 5 OR cp.IRPts >= 5)
 AND (DATEPART(dw, cp.Date) in (2,3) AND DATEPART(hh,cp.Date) > 14)
 AND DATEDIFF(m,cp.Date,GETDATE()) < 2

GROUP BY cp.Account
, cp.FirstName
, cp.LastName
, DATENAME(dw, cp.Date)
, cp.EGSPts
, cp.IRPts
, pm.Birthdate

ORDER BY cp.Account
0 голосов
/ 01 ноября 2010

Я не на 100% ясно понимаю, чего вы хотите достичь.

Я думаю, вы хотите что-то вроде этого:

select *
  from CombinedPts
 where CombinedPts.Date > start_of_contest
  and CombinedPts.Date < end_of_contest
  and ( datepart( dw, CombinedPts.Date ) = 2 or datepart( h, CombinedPts.Date ) < 14 )
  and ( datepart( dw, CombinedPts.Date ) = 3 or datepart( h, CombinedPts.Date ) < 14 )
 having sum( CombinedPts.EGSPts ) >= 5

Datepart используется здесь, чтобы убедиться, что он на правильномдень и время.

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