仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3117|回复: 9
打印 上一主题 下一主题

[学习教程] MSSQL网页设计T-SQL: 三个通用的与日期相干的,帮助按...

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:37:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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
因此我们看到,这些信息足够让我们对单个操作实现“逆操作”。
老尸 该用户已被删除
沙发
发表于 2015-1-18 07:03:08 | 只看该作者
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
蒙在股里 该用户已被删除
板凳
发表于 2015-1-21 12:20:00 | 只看该作者
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
小妖女 该用户已被删除
地板
发表于 2015-1-30 17:59:46 | 只看该作者
只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-6 14:41:59 | 只看该作者
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
精灵巫婆 该用户已被删除
6#
发表于 2015-2-16 16:16:52 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
若相依 该用户已被删除
7#
发表于 2015-3-5 06:48:18 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
若天明 该用户已被删除
8#
发表于 2015-3-12 00:00:17 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-19 16:49:13 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
透明 该用户已被删除
10#
发表于 2015-3-29 08:51:23 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表