加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

SQL Server日期计较(保藏)

发布时间:2018-08-16 11:43:57 所属栏目:电商 来源:站长网
导读:凡是,你必要获适合前日期和计较一些其他的日期,譬喻,你的措施也许必要判定一个月的第一天可能最后一天。你们大部门人或许都知道奈何把日期举办支解(年、月、日等),然后仅仅用支解出来的年、月、日等放在几个函数上钩较出本身所必要的日期!在这篇文

凡是,你必要获适合前日期和计较一些其他的日期,譬喻,你的措施也许必要判定一个月的第一天可能最后一天。你们大部门人或许都知道奈何把日期举办支解(年、月、日等),然后仅仅用支解出来的年、月、日等放在几个函数上钩较出本身所必要的日期!在这篇文章里,我将汇报你怎样行使DATEADD和DATEDIFF函数来计较出在你的措施中也许你要用到的一些差异日期。 
       在行使本文中的例子之前,你必需留意以下的题目。大部门也许不是全部例子在差异的呆板上执行的功效也许纷歧样,这完全由哪一天是一个礼拜的第一天这个配置抉择。第一天(DATEFIRST)设定抉择了你的体系行使哪一天作为一周的第一天。全部以下的例子都是以礼拜天作为一周的第一天来成立,也就是第一天配置为7。若是你的第一天配置纷歧样,你也许必要调解这些例子,使它和差异的第一天配置相切合。你可以通过@@DATEFIRST函数来搜查第一天配置。 
 
       为了领略这些例子,我们先温习一下DATEDIFF和DATEADD函数。DATEDIFF函数计较两个日期之间的小时、天、周、月、年等时距离断总数。DATEADD函数计较一个日期通过给时距离断加减来得到一个新的日期。要相识更多的DATEDIFF和DATEADD函数以实时距离断可以阅读微软联机辅佐。 
 
       行使DATEDIFF和DATEADD函数来计较日期,和原来从当前日期转换到你必要的日期的思量要领有点差异。你必需从时距离断这个方面来思量。好比,从当前日期到你要获得的日期之间有几多时距离断,可能,从本日到某一天(好比1900-1-1)之间有几多时距离断,等等。领略奈何着眼于时距离断有助于你轻松的领略我的差异的日期计较例子。 
 
一个月的第一天 
 
       第一个例子,我将汇报你怎样从当前日期去这个月的最后一天。请留意:这个例子以及这篇文章中的其他例子都将只行使DATEDIFF和DATEADD函数来计较我们想要的日期。每一个例子都将通过计较但前的时距离断,然后举办加减来获得想要计较的日期。 
 
       这是计较一个月第一天的SQL  剧本: 
       SELECT  DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0) 
 
       我们把这个语句分隔来看看它是怎样事变的。最焦点的函数是getdate(),大部门人都知道这个是返回当前的日期和时刻的函数。下一个执行的函数DATEDIFF(mm,0,getdate())是计较当前日期和“1900-01-01  00:00:00.000”这个日期之间的月数。记着:时期和时刻变量和毫秒一样是从“1900-01-01  00:00:00.000”开始计较的。这就是为什么你可以在DATEDIFF函数中指定第一个时刻表达式为“0”。下一个函数是DATEADD,增进当前日期到“1900-01-01”的月数。通过增进预界说的日期“1900-01-01”和当前日期的月数,我们可以得到这个月的第一天。其它,计较出来的日期的时刻部门将会是“00:00:00.000”。 
 
       这个计较的能力是先计较当前日期到“1900-01-01”的时距离断数,然后把它加到“1900-01-01”上来得到非凡的日期,这个能力可以用来计较许多差异的日期。下一个例子也是用这个能力从当前日期来发生差异的日期。 
 
  
本周的礼拜一 
 
       这里我是用周(wk)的时距离断来计较哪一天是本周的礼拜一。 
 
       SELECT  DATEADD(wk,  DATEDIFF(wk,0,getdate()),  0) 
 
一年的第一天 
 
       此刻用年(yy)的时距离断来表现这一年的第一天。 
 
       SELECT  DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0) 
 
季度的第一天 
 
       若是你要计较这个季度的第一天,这个例子汇报你该怎样做。 
 
       SELECT  DATEADD(qq,  DATEDIFF(qq,0,getdate()),  0) 
 
当天的三更 
 
       曾经必要通过getdate()函数为了返回时刻值截掉时刻部门,就会思量到当前日期是不是在三更。若是这样,这个例子行使DATEDIFF和DATEADD函数来得到三更的时刻点。 
 
       SELECT  DATEADD(dd,  DATEDIFF(dd,0,getdate()),  0) 
 
深入DATEDIFF和DATEADD函数计较 
 
       你可以大白,通过行使简朴的DATEDIFF和DATEADD函数计较,你可以发明许多差异的也许故意义的日期。 
 
       今朝为止的全部例子只是仅仅计较当前的时刻和“1900-01-01”之间的时距离断数目,然后把它加到“1900-01-01”的时距离断上来计较出日期。假定你修改时距离断的数目,可能行使差异的时距离断来挪用DATEADD函数,可能减去时距离断而不是增进,那么通过这些小的调解你可以发明和多差异的日期。 
 
       这里有四个例子行使其它一个DATEADD函数来计较最后一天来别离替代DATEADD函数前后两个时距离断。 
 
上个月的最后一天 
 
       这是一个计较上个月最后一天的例子。它通过从一个月的最后一天这个例子上减去3毫秒来得到。有一点要记着,在Sql  Server中时刻是准确到3毫秒。这就是为什么我必要减去3毫秒来得到我要的日期和时刻。 
 
       SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0)) 
 
       计较出来的日期的时刻部门包括了一个Sql  Server可以记录的一天的最后时候(“23:59:59:997”)的时刻。 
 
客岁的最后一天 
 
       毗连上面的例子,为了要获得客岁的最后一天,你必要在本年的第一天上减去3毫秒。 
 
       SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)) 
 
本月的最后一天 
 
       此刻,为了得到本月的最后一天,我必要轻微修改一下得到上个月的最后一天的语句。修改必要给用DATEDIFF较量当前日期和“1900-01-01”返回的时距离断上加1。通过加1个月,我计较出下个月的第一天,然后减去3毫秒,这样就计较出了这个月的最后一天。这是计较本月最后一天的SQL剧本。 
 
       SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0)) 
 
今年的最后一天 
 
       你此刻应该把握这个的做法,这是计较今年最后一天剧本 
 
       SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate())+1,  0))。 
 
本月的第一个礼拜一 
 
       好了,此刻是最后一个例子。这里我要计较这个月的第一个礼拜一。这是计较的剧本。 
 
         select  DATEADD(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-1  10:00:00' 
SELECT  @,DATEADD(day,  DATEDIFF(day,0,@),  0) 
 
2)表现礼拜几 
select  datename(weekday,getdate())   
 
3)怎样取得某个月的天数 
declare  @m  int 
set  @m=2  --月份 
select    datediff(day,'2003-'+cast(@m  as  varchar)+'-15'  ,'2003-'+cast(@m+1    as  varchar)+'-15') 
其它,取得本月天数 
select    datediff(day,cast(month(GetDate())  as  varchar)+'-'+cast(month(GetDate())  as  varchar)+'-15'  ,cast(month(GetDate())  as  varchar)+'-'+cast(month(GetDate())+1    as  varchar)+'-15') 
可能行使计较本月的最后一天的剧本,然后用DAY函数区最后一天 
SELECT  Day(dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0))) 
 
4)判定是否闰年: 
SELECT  case  day(dateadd(mm,  2,  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0))))  when  28  then  '平年'  else  '闰年'  end 
可能 
select  case  datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate())+'-02-01')) 
when  28  then  '平年'  else  '闰年'  end 
 
5)一个季度几多天 
declare  @m  tinyint,@time  smalldatetime 
select  @m=month(getdate()) 
select  @m=case  when  @m  between  1  and  3  then  1 
                       when  @m  between  4  and  6  then  4 
                       when  @m  between  7  and  9  then  7 
                       else  10  end 
select  @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01' 
select  datediff(day,@time,dateadd(mm,3,@time)) 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读