如何在SQL中的2个月或3个月内设置每周2个重复日的日期范围?

时间:2010-11-01 20:04:27

标签: sql-server date sql-server-2005

我正在使用Microsoft SQL Server 2005,需要对星期二符合我们50+锦标赛资格的玩家进行分析 - >要获得参赛资格,他们需要在周一下午2点之前的周一或周二获得5分以上,并且积分不是累积的(必须在周一或周二下午2点之前获得最少5分)。我正在使用的代码如下,但到目前为止只包含特定星期一和星期二的日期范围。我需要在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 :(得分:0)

我不是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确保它在正确的日期和时间。

答案 1 :(得分:0)

这是一个有点不同的结构,但大致相同。我使用别名而不是完整的引用。它也是未经测试的,但干净地解析。

AND DATEDIFF(m,cp.Date,GETDATE()) < 2为您提供2个月的窗口。

编辑 - 添加了日期和时间的条款。 AND (DATEPART(dw, cp.Date) in (2,3) AND DATEPART(hh,cp.Date) > 14)仅在下午2:00(1400小时)后的周一和周二为您提供

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