仓酷云

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

[学习教程] MSSQL编程:SQL Server各类日期盘算办法之一

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

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

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

x
我们分析上面的两个操作,都有一个“删除数据”的过程。  一般,你必要取得以后日期和盘算一些其他的日期,比方,你的程序大概必要判别一个月的第一天大概最初一天。你们年夜部分人也许都晓得如何把日期举行支解(年、月、日等),然后仅仅用支解出来的年、月、日等放在几个函数上钩算出本人所必要的日期!在这篇文章里,我将告知你怎样利用DATEADD和DATEDIFF函数来盘算出在你的程序中大概你要用到的一些分歧日期。
  在利用本文中的例子之前,你必需注重以下的成绩。年夜部分大概不是一切例子在分歧的呆板上实行的了局大概纷歧样,这完整由哪一天是一个礼拜的第一天这个设置决意。第一天(DATEFIRST)设定决意了你的体系利用哪一天作为一周的第一天。一切以下的例子都是以礼拜天作为一周的第一天来创建,也就是第一天设置为7。假设你的第一天设置纷歧样,你大概必要调剂这些例子,使它和分歧的第一天设置符合合。你能够经由过程@@DATEFIRST函数来反省第一天设置。
  
  为了了解这些例子,我们先温习一下DATEDIFF和DATEADD函数。DATEDIFF函数盘算两个日期之间的小时、天、周、月、年等工夫距离总数。DATEADD函数盘算一个日期经由过程给工夫距离加减来取得一个新的日期。要懂得更多的DATEDIFF和DATEADD函数和工夫距离能够浏览微软联机匡助。
  
  利用DATEDIFF和DATEADD函数来盘算日期,和原本从以后日期转换到你必要的日期的思索办法有点分歧。你必需从工夫距离这个方面来思索。好比,从以后日期到你要失掉的日期之间有几工夫距离,大概,从明天到某一天(好比1900-1-1)之间有几工夫距离,等等。了解如何着眼于工夫距离有助于你轻松的了解我的分歧的日期盘算例子。
  
  一个月的第一天
  
  第一个例子,我将告知你怎样从以后日期往这个月的最初一天。请注重:这个例子和这篇文章中的其他例子都将只利用DATEDIFF和DATEADD函数来盘算我们想要的日期。每个例子都将经由过程盘算但前的工夫距离,然落后行加减来失掉想要盘算的日期。
  
  这是盘算一个月第一天的SQL剧本:

  SELECTDATEADD(mm,DATEDIFF(mm,0,getdate()),0)
  
  我们把这个语句分隔来看看它是怎样事情的。最中心的函数是getdate(),年夜部分人都晓得这个是前往以后的日期和工夫的函数。下一个实行的函数DATEDIFF(mm,0,getdate())是盘算以后日期和“1900-01-0100:00:00.000”这个日期之间的月数。记着:时代和工夫变量和毫秒一样是从“1900-01-0100:00:00.000”入手下手盘算的。这就是为何你能够在DATEDIFF函数中指定第一个工夫表达式为“0”。下一个函数是DATEADD,增添以后日期到“1900-01-01”的月数。经由过程增添预界说的日期“1900-01-01”和以后日期的月数,我们能够取得这个月的第一天。别的,盘算出来的日期的工夫部分将会是“00:00:00.000”。
  
  这个盘算的技能是先盘算以后日期到“1900-01-01”的工夫距离数,然后把它加到“1900-01-01”下去取得特别的日期,这个技能能够用来盘算良多分歧的日期。下一个例子也是用这个技能从以后日期来发生分歧的日期。
  本周的礼拜一
  
  这里我是用周(wk)的工夫距离来盘算哪一天是本周的礼拜一。
  
  SELECTDATEADD(wk,DATEDIFF(wk,0,getdate()),0)
  
  一年的第一天
  
  如今用年(yy)的工夫距离来显现这一年的第一天。
  
  SELECTDATEADD(yy,DATEDIFF(yy,0,getdate()),0)
  
  季度的第一天
  
  假设你要盘算这个季度的第一天,这个例子告知你该怎样做。
  
  SELECTDATEADD(qq,DATEDIFF(qq,0,getdate()),0)
  
  当天的三更
  
  已经必要经由过程getdate()函数为了前往工夫值截失落工夫部分,就会思索到以后日期是否是在三更。假设如许,这个例子利用DATEDIFF和DATEADD函数来取得三更的工夫点。
  
  SELECTDATEADD(dd,DATEDIFF(dd,0,getdate()),0)
  
  深切DATEDIFF和DATEADD函数盘算
  
  你能够分明,经由过程利用复杂的DATEDIFF和DATEADD函数盘算,你能够发明良多分歧的大概成心义的日期。
  
  今朝为止的一切例子只是仅仅盘算以后的工夫和“1900-01-01”之间的工夫距离数目,然后把它加到“1900-01-01”的工夫距离下去盘算出日期。假定你修正工夫距离的数目,大概利用分歧的工夫距离来挪用DATEADD函数,大概减往工夫距离而不是增添,那末经由过程这些小的调剂你能够发明和多分歧的日期。
  
  这里有四个例子利用别的一个DATEADD函数来盘算最初一天来分离交换DATEADD函数前后两个工夫距离。

在执行崩溃恢复时,理解在一个数据库中的每一个表tbl_name对应的在数据库目录中的3个文件是很重要的:
冷月葬花魂 该用户已被删除
沙发
发表于 2015-1-19 06:51:11 | 只看该作者
我们学到了什么?思考问题的时候从表的角度来思考问
再见西城 该用户已被删除
板凳
发表于 2015-1-26 20:11:31 | 只看该作者
同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
深爱那片海 该用户已被删除
地板
发表于 2015-2-4 20:54:32 | 只看该作者
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
山那边是海 该用户已被删除
5#
发表于 2015-2-10 10:16:29 | 只看该作者
呵呵,这就是偶想说的
老尸 该用户已被删除
6#
发表于 2015-3-1 09:45:53 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-10 14:50:22 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
admin 该用户已被删除
8#
发表于 2015-3-17 08:19:46 | 只看该作者
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
小魔女 该用户已被删除
9#
发表于 2015-3-24 04:15:42 | 只看该作者
我个人认为就是孜孜不懈的学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-17 22:47

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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