近日要做一个论坛日志统计

统计出  上月 、上周、昨天的论坛积分排名

先说说表吧:
bbsscore  论坛积分日志表
marks         分数
userid       客户id

上月的积分统计很简单:
select sum(marks),userid  from bbsscore where month(createdate)=(month(getdate())-1) group by userid

昨天的积分统计也很简单:
select sum(marks),userid  from bbsscore where day(createdate)=(day(getdate())-1) group by userid

难就难在 上周的  -_-!,上网找找,找到一个比较好的
先放那2句sql语句吧:

比如说今天是:2008-11-19
语句一:
select dateadd(day, 1 - datepart(weekday,convert(varchar(10), getdate() - 7, 120)), convert(varchar(10), getdate()- 7, 120))
结果是:2008-11-09 00:00:00.000

语句二:
select dateadd(day, 1 - datepart(weekday,convert(varchar(10), getdate() - 7, 120)), convert(varchar(10), getdate(), 120))
结果是:2008-11-16 00:00:00.000

这样就获得了上周的时间了!!!!
上周的积分统计
select sum(score),userid
from gk_userscoretrans where
createdate>=(select dateadd(day, 1 - datepart(weekday,convert(varchar(10), getdate() - 7, 120)), convert(varchar(10), getdate()- 7, 120)))
and
createdate>(select dateadd(day, 1 - datepart(weekday,convert(varchar(10), getdate() - 7, 120)), convert(varchar(10), getdate(), 120)))
group by userid

然后俺再来一个一个解释sql里面的函数吧:(以下均在isqlw)

getdate():
返回当前数据库系统时间戳,返回值的类型为 datetime,并且不含数据库时区偏移量。此值得自运行 sql server 实例的计算机的操作系统。
:selsect getdate()  
-----  2008-11-19 11:46:44.310

=====================================================
小插曲,介绍 varchar和 char的区别:
varchar 对每个英文(ascii)字符都占用2个字节,对一个汉字也只占用两个字节
char 对英文(ascii)字符占用1个字节,对一个汉字占用2个字节
varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"
而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。

由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!
=====================================================
convert(data_type,expression[,style]):
此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到.
其中style有很多种式样,这里就不一一列举了,上面的120代表:yyyymmdd hh:mi:ss(24小时制)
如:select convert(varchar(10), getdate(), 120)  
-----  2008-11-19

 

datepart:
返回表示指定 date 的指定 datepart 的整数。
datepart ( datepart , date )
datepart
        是将为其返回 integerdate(日期或时间值)的一部分。下表列出了所有有效的 datepart 参数。用户定义的变量等效项是无效的。
date 
        是一个表达式,可以解析为 timedatesmalldatetimedatetimedatetime2datetimeoffset 值。date 可以是表达式、列表达式、用户定义的变量或字符串文字。
如:select datepart(weekday,convert(varchar(10), getdate() - 7, 120))   
-----  4
在sql中周日表示1 周一表示2 一次类推周二 3.....
得出结果为:4 (19号为周三)

dateadd :
将指定 number 时间间隔(有符号整数)与指定 date 的指定 datepart 相加后,返回该 date。
dateadd (datepart , number, date )
datepart
        是与 integer number 相加的 date 部分。下表列出了所有有效的 datepart 参数。用户定义的变量等效项是无效的。
number
        是一个表达式,可以解析为与 datedatepart 相加的 int。用户定义的变量是有效的。如果您指定一个带小数的值,则将小数截去且不进行舍入。
date
        是一个表达式,可以解析为 timedatesmalldatetimedatetimedatetime2datetimeoffset 值。date 可以是表达式、列表达式、用户定义的变量或字符串文字。如果表达式是字符串文字,则它必须解析为一个 datetime 值。
如:
select dateadd(day, 1 - datepart(weekday,convert(varchar(10), getdate() - 7, 120)), convert(varchar(10), getdate(), 120))
-----   2008-11-16 00:00:00.000

select dateadd(day, 1 - datepart(weekday,convert(varchar(10), getdate() - 7, 120)), convert(varchar(10), getdate()- 7, 120))
-----   2008-11-09 00:00:00.000

其中有很多参数的值需要去查询,比如: dateadd 和datepart中的datepart ,convert中的style, 俺在这里就不一一列举了