≮崩溃≯不劳阁,俺的blog纯粹属于好玩,如有雷同 纯属巧合!
19 Nov
近日要做一个论坛日志统计
统计出 上月 、上周、昨天的论坛积分排名
先说说表吧:
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
是将为其返回 integer 的 date(日期或时间值)的一部分。下表列出了所有有效的 datepart 参数。用户定义的变量等效项是无效的。
date
是一个表达式,可以解析为 time、date、smalldatetime、datetime、datetime2 或 datetimeoffset 值。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
是一个表达式,可以解析为与 date 的 datepart 相加的 int。用户定义的变量是有效的。如果您指定一个带小数的值,则将小数截去且不进行舍入。
date
是一个表达式,可以解析为 time、date、smalldatetime、datetime、datetime2 或 datetimeoffset 值。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, 俺在这里就不一一列举了
博主看到您的博客感觉很棒,希望能做个链接
已经在首页添加好了您的链接
我的博客是 www.dangdang.ac.cn
博客名字是 当当网
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。