关于DATEDIFF 函数
脚本:
select gpc.dtime,count( distinct gpc.S_ACCOUNT) as active from (
select convert(varchar(10),a.D_BEGIN,120) as dtime ,b.n_issuer_id,b.S_ACCOUNT,
cast(SUM(DATEDIFF(hh,a.D_BEGIN,CASE WHEN a.D_END IS NULL THEN GETDATE() ELSE a.D_END END))*1.00/count(distinct a.n_aid) as numeric(18,2)) times
from dbo.GAME_LOG_chosen_2012_9 a
left join pp_passport b
on a.N_AID=b.N_AID
where a.D_BEGIN>='2012-09-01'
and a.D_END<'2012-09-08'
group by convert(varchar(10),a.D_BEGIN,120) ,b.S_ACCOUNT,b.n_issuer_id
having cast(SUM(DATEDIFF(hh,a.D_BEGIN,CASE WHEN a.D_END IS NULL THEN GETDATE() ELSE a.D_END END))
*1.00/count(distinct a.n_aid) as numeric(18,2))>=3
) gpc
group by gpc.dtime
解释:以上脚本是计算游戏数据中,每天活跃玩家数目,活跃玩家定义为:每日累计登录超过3小时的玩家定义为活跃玩家。
知识点:cast(SUM(DATEDIFF(hh,a.D_BEGIN,CASE WHEN a.D_END IS NULL THEN GETDATE() ELSE a.D_END END))*1.00/count(distinct a.n_aid) as numeric(18,2))
1、DATEDIFF(hh,a.D_BEGIN,CASE WHEN a.D_END IS NULL THEN GETDATE() ELSE a.D_END END)
1, DateDiff,函数操作名。表示两个指定日期间的时间间隔数目。
2,datediff 定义
DateDiff(interval, date1, date2【, firstdayofweek【, firstweekofyear】】)
interval 字符串表达式,表示用来计算date1 和 date2 的时间差的时间间隔
Date1□date2 必要;Variant (Date)。计算中要用到的两个日期。
Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。
firstweekofyear 可选。指定一年的第一周的常数。如果未予指定,则以包含 1 月 1 日的星期为第一周。
3、interval 常用参数设置
datepart 参数可以是下列的值:
datepart 缩写 年 yy, yyyy 季度 qq, q 月 mm, m 年中的日 dy, y 日 dd, d 周 wk, ww 星期 dw, w 小时 hh 分钟 mi, n 秒 ss, s 毫秒 ms 微妙 mcs 纳秒 ns