仓酷云

标题: MSSQL网站制作之SQL Server各类日期盘算办法之二 [打印本页]

作者: 飘飘悠悠    时间: 2015-1-16 22:17
标题: MSSQL网站制作之SQL Server各类日期盘算办法之二
支持多种存储引擎。  上个月的最初一天
  
  这是一个盘算上个月最初一天的例子。它经由过程从一个月的最初一天这个例子上减往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
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
作者: 兰色精灵    时间: 2015-1-27 16:04
记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。
作者: 冷月葬花魂    时间: 2015-2-5 11:49
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
作者: 分手快乐    时间: 2015-2-11 16:12
大侠们有推荐的书籍和学习方法写下吧。
作者: 飘灵儿    时间: 2015-3-2 15:47
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
作者: 柔情似水    时间: 2015-3-11 04:31
一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。
作者: 仓酷云    时间: 2015-3-17 21:07
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
作者: 精灵巫婆    时间: 2015-3-25 02:37
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2