仓酷云

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

[学习教程] MSSQL网站制作之SQL Server各类日期盘算办法之二

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

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

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

x
支持多种存储引擎。  上个月的最初一天
  
  这是一个盘算上个月最初一天的例子。它经由过程从一个月的最初一天这个例子上减往3毫秒来取得。有一点要记着,在SqlServer中工夫是准确到3毫秒。这就是为何我必要减往3毫秒来取得我要的日期和工夫。
  
  SELECTdateadd(ms,-3,DATEADD(mm,DATEDIFF(mm,0,getdate()),0))
  
  盘算出来的日期的工夫部分包括了一个SqlServer能够纪录的一天的最初时候(“23:59:59:997”)的工夫。
  
  客岁的最初一天
  
  毗连下面的例子,为了要失掉客岁的最初一天,你必要在往年的第一天上减往3毫秒。
  
  SELECTdateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate()),0))
  
  本月的最初一天
  
  如今,为了取得本月的最初一天,我必要略微修正一下取得上个月的最初一天的语句。修正必要给用DATEDIFF对照以后日期和“1900-01-01”前往的工夫距离上加1。经由过程加1个月,我盘算出下个月的第一天,然后减往3毫秒,如许就盘算出了这个月的最初一天。这是盘算本月最初一天的SQL剧本。
  
  SELECTdateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0))
  
  今年的最初一天
  
  你如今应当把握这个的做法,这是盘算今年最初一天剧本
  
  SELECTdateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate())+1,0))。
  
  本月的第一个礼拜一
  
  好了,如今是最初一个例子。这里我要盘算这个月的第一个礼拜一。这是盘算的剧本。
  
 selectDATEADD(wk,DATEDIFF(wk,0,
  dateadd(dd,6-datepart(day,getdate()),getdate())
  ),0)
  
  在这个例子里,我利用了“本周的礼拜一”的剧本,并作了一点点修正。修正的部分是把本来剧本中“getdate()”部分交换成盘算本月的第6天,在盘算顶用本月的第6天来交换以后日期使得盘算能够取得这个月的第一个礼拜一。
  
  总结
  
  我但愿这些例子能够在你用DATEADD和DATEDIFF函数盘算日期时给你一点启示。经由过程利用这个盘算日期的工夫距离的数学办法,我发明为了显现两个日期之间距离的有效历法是有代价的。注重,这只是盘算出这些日期的一种办法。要切记,另有良多办法能够失掉不异的盘算了局。假设你有其他的办法,那很不错,如果你没有,我但愿这些例子能够给你一些启示,当你要用DATEADD和DATEDIFF函数盘算你程序大概要用到的日期时。
  附录:其另日期处置办法
  
  1)往失落时分秒
 declare@datetime
  set@=getdate()--2003-7-110:00:00
  SELECT@,DATEADD(day,DATEDIFF(day,0,@),0)
 
  2)显现礼拜几
selectdatename(weekday,getdate())
  3)怎样获得某个月的天数
  declare@mint
  set@m=2--月份
  selectdatediff(day,2003-+cast(@masvarchar)+-15,2003-+cast(@m+1asvarchar)+-15)
  别的,获得本月天数
  selectdatediff(day,cast(month(GetDate())asvarchar)+-+cast(month(GetDate())asvarchar)+-15,cast(month(GetDate())asvarchar)+-+cast(month(GetDate())+1asvarchar)+-15)
  大概利用盘算本月的最初一天的剧本,然后用DAY函数区最初一天
  SELECTDay(dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0)))

  4)判别是不是闰年:
 SELECTcaseday(dateadd(mm,2,dateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate()),0))))when28then闰年else闰年end
  大概
  selectcasedatediff(day,datename(year,getdate())+-02-01,dateadd(mm,1,datename(year,getdate())+-02-01))
  when28then闰年else闰年end
  
  5)一个季度几天
 
 declare@mtinyint,@timesmalldatetime
  select@m=month(getdate())
  select@m=casewhen@mbetween1and3then1
  when@mbetween4and6then4
  when@mbetween7and9then7
  else10end
  select@time=datename(year,getdate())+-+convert(varchar(10),@m)+-01
  selectdatediff(day,@time,dateadd(mm,3,@time))


我们只需要把binlog文件反向执行,每个操作都执行逆操作即可。当然也不是所有的event都反转。Table_mapevent必须还是在Rows_log_event每个操作之前。
小魔女 该用户已被删除
沙发
发表于 2015-1-19 06:51:38 | 只看该作者
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
兰色精灵 该用户已被删除
板凳
发表于 2015-1-27 16:04:52 | 只看该作者
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
冷月葬花魂 该用户已被删除
地板
发表于 2015-2-5 11:49:32 | 只看该作者
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
分手快乐 该用户已被删除
5#
发表于 2015-2-11 16:12:05 | 只看该作者
大侠们有推荐的书籍和学习方法写下吧。
飘灵儿 该用户已被删除
6#
发表于 2015-3-2 15:47:47 | 只看该作者
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
柔情似水 该用户已被删除
7#
发表于 2015-3-11 04:31:43 | 只看该作者
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
8#
发表于 2015-3-17 21:07:19 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
精灵巫婆 该用户已被删除
9#
发表于 2015-3-25 02:37:50 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 18:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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