仓酷云

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

[学习教程] MSSQL网页设计SQL Server日期盘算(保藏)

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

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

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

x
使为了数据安全,我们搭建了主从。但实时主从备份只能防止硬件问题,比如主库的硬盘损坏。但对于误操作,则无能为力。比如在主库误删一张表,或者一个update语句没有指定where条件,导致全表被更新。server
一般,你必要取得以后日期和盘算一些其他的日期,比方,你的程序大概必要判别一个月的第一天大概最初一天。你们年夜部分人也许都晓得如何把日期举行支解(年、月、日等),然后仅仅用支解出来的年、月、日等放在几个函数上钩算出本人所必要的日期!在这篇文章里,我将告知你怎样利用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函数前后两个工夫距离。

上个月的最初一天

这是一个盘算上个月最初一天的例子。它经由过程从一个月的最初一天这个例子上减往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))
先说DDL的分类。有一类DDL,是不需要重建表的,比如加非聚簇索引。这类操作其实不会丢数据,也是在原表上直接操作,对于我们“以恢复数据为目的”的闪回,是可以先忽略的。另外一类,则是会影响到表数据的操作。
精灵巫婆 该用户已被删除
沙发
发表于 2015-1-19 20:35:53 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
兰色精灵 该用户已被删除
板凳
发表于 2015-1-28 10:25:14 | 只看该作者
Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。
再见西城 该用户已被删除
地板
发表于 2015-2-5 16:52:54 | 只看该作者
从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。
小妖女 该用户已被删除
5#
发表于 2015-2-12 23:09:03 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
爱飞 该用户已被删除
6#
发表于 2015-3-3 11:28:58 | 只看该作者
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
变相怪杰 该用户已被删除
7#
发表于 2015-3-11 10:27:03 | 只看该作者
SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)
活着的死人 该用户已被删除
8#
 楼主| 发表于 2015-3-18 06:13:57 | 只看该作者
SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
海妖 该用户已被删除
9#
发表于 2015-3-25 12:50:32 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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