SQL 按月查询
项目中需要根据课件名称按月统计出访问的情况,第一次我采用了最土的一种办法,使用循环,给sql传递年月两个参数,
for(var y=2009;y<=2010;y++){
for(var m=1;m<=12;m++){
// todo : SQL 查询
}
}
这样,统计2009年到2010年的月报表,就需要循环2*12 次,如果数据库中某月并未有数据,那么就等于是白白占用带宽请求服务器了。
经过linchun的点拨,结合冰哥之前的查询,使用Convert 和Datepart 即可实现这种查询,然后再在前台通过JavaScript处理数据。
SELECT a.[ID]
,a.[Name]
,fna(a.[ID], CONVERT([datetime],CONVERT([varchar](8),b.[Timestamp],(102))+'01',0) ) as UserCount ,(CONVERT([datetime],CONVERT([varchar](8),b.[Timestamp],(102))+'01',0)) as ReportDate
from [dbo].[lcms_CourseWare] a
inner join [dbo].[lcms_SessionTime] b
on a.[ID] = b.[CourseWareID]
where [State]=1
and [DelFlag]=0
group by (CONVERT([datetime],CONVERT([varchar](8),b.[Timestamp],(102))+'01',0))
,a.[ID],a.[Name]
在function 中,接收时间参数:
CREATE FUNCTION fna(
@CourseWareID varchar(32)
, @ReportDate datetime
)
RETURNS bigint
AS
BEGIN
RETURN (
SELECT COUNT(distinct [UserID])
from [dbo].[lcms_SessionTime]
WHERE CourseWareID = @CourseWareID
and year([Timestamp])=DATEPART(YEAR,@ReportDate)
and month([Timestamp])=DATEPART(MONTH,@ReportDate)
)
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
相关文档:
这几天一直被中文乱码问题困扰,中文数据插入到My Sql中很正常,在Command client line中也能正常显示,可从数据库中读到JSP页面上时,就变成“火星文”了。
于是上网查询,也看到好多方法:有的说把my.ini中default-character-set=latin1改为default-character-set=utf8,有 ......
SELECT * into newtable
from OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\aaaa.xls";User ID=Admin;Password=;Extended properties=Excel 11.0')...[Sheet1$]
/******* 导出到excel
exec master..xp_cmdshell 'bcp settledb.dbo.shanghu out c:\temp1.xls -c -q -s"gnetdata/gnetdata" - ......
SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中 ......
我们要做到不但会写SQL,还要做到写出性能优良的SQL语句。
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):
Oracle的解析器按照从右到左的顺序处理from子句中的表名,from子句中写在最后的表(基础表 driving table)将被最先处理,在f ......