MSSQL网页设计T-SQL: 三个通用的与日期相干的,帮助按...
2008年1月16号MySQLAB被Sun公司收购。而2009年,SUN又被Oracle收购。就这样如同一个轮回,MySQL成为了Oracle公司的另一个数据库项目。函数/*
每一个函数都只要一句话!
实在都是从我的另外一篇blog里抠出来的:
T-SQL天生两个新的真实的公积年历
http://blog.csdn.net/playyuer/archive/2004/04/07/2860.aspx
T-SQL天生一个浅易的公积年历T-SQL含日期地点月及年的周次
http://blog.csdn.net/playyuer/archive/2004/04/05/2859.aspx
因为利用了(@@datefirst+datepart(weekday,@date))%7判别周几
因而与datefirst有关,且可顺应各类言语版本的SQLServer
*/
--周日算作(上一)周的最初一天
createfunctionudf_WeekOfYear(@datedatetime)
--求@date地点周是昔时的第几周
--周日算作(上一)周的最初一天
--用于按周汇总Groupby时,不要有跨年纪据,大概同时Groupbyyear
--groupbyyear(date),month(date),dbo.udf_WeekOfYear(date),dbo.udf_WeekOfMonth(date)
returnsint
as
begin
return
(selectdatediff(week
,casewhen(@@datefirst+datepart(weekday,dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@date),0)))))%7=1
thendateadd(day,-1,dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@date),0))))
elsedateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@date),0)))--date地点年的第一天即:一月一号
end
,casewhen(@@datefirst+datepart(weekday,@date))%7=1
thendateadd(day,-1,@date)
else@date
end
)+1)
end
go
createfunctionudf_WeekOfMonth(@datedatetime)
--求@date地点周是当月的第几周
--周日算作(上一)周的最初一天
--用于按周汇总Groupby时,不要有跨月跨年纪据,大概同时Groupbyyear,month
--groupbyyear(date),month(date),dbo.udf_WeekOfYear(date),dbo.udf_WeekOfMonth(date)
returnsint
as
begin
return
(selectdatediff(week
,casewhen(@@datefirst+datepart(weekday,dateadd(month,datediff(month,0,@date),0)))%7=1
thendateadd(month,datediff(month,0,@date),0)-1
elsedateadd(month,datediff(month,0,@date),0)
end
,casewhen(@@datefirst+datepart(weekday,@date))%7=1
then@date-1
else@date
end
)+1)
end
go
createfunctionudf_weekday(@int,@datedatetime)
returnsdatetime
as
begin
/*
--周日算作(上一)周的最初一天
当@<=1代表将@date映照到地点周的礼拜一
当@=2代表将@date映照到地点周的礼拜二
当@=3代表将@date映照到地点周的礼拜三
当@=4代表将@date映照到地点周的木曜日
当@=5代表将@date映照到地点周的礼拜五
当@=6代表将@date映照到地点周的礼拜六
当@>=7代表将@date映照到地点周的日曜日
可用于按周汇总Groupby,均撑持跨年跨月数据
*/
return
(select--@date,datename(weekday,@date),(@@datefirst+datepart(weekday,@date))%7,3-(@@datefirst+datepart(weekday,@date))%7,
dateadd(day
,casewhen(@@datefirst+datepart(weekday,@date))%7=0--周六
then
casewhen@between1and6
then@-6
else1
end
when(@@datefirst+datepart(weekday,@date))%7=1--周日(七)
then
casewhen@between1and6
then@-7
else0
end
when(@@datefirst+datepart(weekday,@date))%7between2and6--周一至周五
then
casewhen@between1and6
then@+1-(@@datefirst+datepart(weekday,@date))%7
else8-(@@datefirst+datepart(weekday,@date))%7
end
end
,@date))
/*
测试:
selectdate,datename(weekday,date),映照到:,dbo.udf_weekday(2,date),datename(weekday,dbo.udf_weekday(1,date))
fromT
orderbydate
--===============
setdatefirst4
declare@int,@aint
set@=1
selectdate,datename(weekday,date),(@@datefirst+datepart(weekday,date))%7,3-(@@datefirst+datepart(weekday,date))%7,
dateadd(day
,casewhen(@@datefirst+datepart(weekday,date))%7=0--周六
then
casewhen@between2and7
then-(7-@)
else@
end
when(@@datefirst+datepart(weekday,date))%7=1--周日
then
casewhen@between2and7
then-(7-@)-1
else@-1
end
when(@@datefirst+datepart(weekday,date))%7between2and6
then
casewhen@between2and7
then@-(@@datefirst+datepart(weekday,date))%7
else8-(@@datefirst+datepart(weekday,date))%7
end
end
,date)
fromd
orderbydate
*/
end
因此我们看到,这些信息足够让我们对单个操作实现“逆操作”。 如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录. 数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。 只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。 一个是把SQL语句写到客户端,可以使用DataSet进行加工; 可以动态传入参数,省却了动态SQL的拼写。 不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关 其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。 对于微软系列的东西除了一遍遍尝试还真没有太好的办法 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
页:
[1]