SQL时间函数.docx

上传人:b****3 文档编号:4795488 上传时间:2023-05-07 格式:DOCX 页数:19 大小:28.22KB
下载 相关 举报
SQL时间函数.docx_第1页
第1页 / 共19页
SQL时间函数.docx_第2页
第2页 / 共19页
SQL时间函数.docx_第3页
第3页 / 共19页
SQL时间函数.docx_第4页
第4页 / 共19页
SQL时间函数.docx_第5页
第5页 / 共19页
SQL时间函数.docx_第6页
第6页 / 共19页
SQL时间函数.docx_第7页
第7页 / 共19页
SQL时间函数.docx_第8页
第8页 / 共19页
SQL时间函数.docx_第9页
第9页 / 共19页
SQL时间函数.docx_第10页
第10页 / 共19页
SQL时间函数.docx_第11页
第11页 / 共19页
SQL时间函数.docx_第12页
第12页 / 共19页
SQL时间函数.docx_第13页
第13页 / 共19页
SQL时间函数.docx_第14页
第14页 / 共19页
SQL时间函数.docx_第15页
第15页 / 共19页
SQL时间函数.docx_第16页
第16页 / 共19页
SQL时间函数.docx_第17页
第17页 / 共19页
SQL时间函数.docx_第18页
第18页 / 共19页
SQL时间函数.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

SQL时间函数.docx

《SQL时间函数.docx》由会员分享,可在线阅读,更多相关《SQL时间函数.docx(19页珍藏版)》请在冰点文库上搜索。

SQL时间函数.docx

SQL时间函数

SQL时间函数

2007-12-2016:

00

中日期函数的用法

悬赏分:

5-解决时间:

2007-3-1320:

40

①DATEADD\DAY\DATEDIFF\GETDATE\DATENAME等函数的用法.

②想查询2007年2月9日的付款流水有单笔交易出现多张小票号的情况的小票号,该用什么语句?

提问者:

420329630-助理二级

最佳答案

1.DateAdd(I,N,D)

将一个日期加上一段期间后的日期。

I:

设定一个日期(Date)所加上的一段期间的单位。

譬如interval="d"表示N的单位为日。

I的设定值如下:

yyyyYear年

qQuarter季

mMonth月

dDay日

wWeekday星期

hHour时

nMinute分

sSecond秒

N:

数值表达式,设定一个日期所加上的一段期间,可为正值或负值,正值表示加(结果为>date以后的日期),负值表示减(结果为>date以前的日期)。

D:

待加减的日期。

例子:

DateAdd("m",1,"31-Jan-98")

结果:

28-Feb-98

说明:

将日期31-Jan-98加上一个月,结果为28-Feb-98而非31-Fe-98。

例子:

DateAdd("d",20,"30-Jan-99")

结果:

1999/2/9

说明:

将一个日期30-Jan-99加上20天后的日期。

2.Day(日期的字符串或表达式)

传回日期的「日」部份。

例子:

Day("12/1/1999")

结果:

1

3.DateDiff(I,D1,D2[,FW[,FY]])

计算两个日期之间的期间。

I:

设定两个日期之间的期间计算之单位。

譬如>I="m"表示计算的单位为月。

>I的设定值如:

yyyy>Year年

qQuarter季

mMonth月

dDay日

wWeekday星期

hHour时

nMinute分

sSecond秒

D1,D2:

计算期间的两个日期表达式,若>date1较早,则两个日期之间的期间结果为正值;若>date2较早,则结果为负值。

FW:

设定每周第一天为星期几,若未设定表示为星期天。

>FW的设定值如下:

0使用>API的设定值。

1星期天

2星期一

3星期二

4星期三

5星期四

6星期五

7星期六

FY:

设定一年的第一周,若未设定则表示一月一日那一周为一年的第一周。

>FY的设定值如下:

0使用>API的设定值。

1一月一日那一周为一年的第一周

2至少包括四天的第一周为一年的第一周

3包括七天的第一周为一年的第一周

例子:

DateDiff("d","25-Mar-99","30-Jun-99")

结果:

97

说明:

显示两个日期之间的期间为97天

想查询2007年2月9日的付款流水有单笔交易出现多张小票号的情况的小票号

这个要看一下你的表结构是什么样的啊?

回答者:

qqsmalltiger-助理二级3-323:

45

评价已经被关闭   目前有0个人评价

      好

50%(0)不好

50%(0)

其他回答   共1条

DATEADD

在向指定日期加上一段时间的基础上,返回新的datetime值。

语法

DATEADD(datepart,number,date)

DATEDIFF

返回跨两个指定日期的日期和时间边界数。

语法

DATEDIFF(datepart,startdate,enddate)

GETDATE

按datetime值的Microsoft®SQLServer™标准内部格式返回当前系统日期和时间。

语法

GETDATE()

DATENAME

返回代表指定日期的指定日期部分的字符串。

语法

DATENAME(datepart,date)

SQL日期计算

通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天

你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几

个函数中计算出自己所需要的日期!

在这篇文章里,我将告诉你如何使用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-01

00:

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--月份

select   datediff(day,'2003-'+cast(@masvarchar)+'-15','2003-'+cast(@m+1   asvarchar)+'-

15')

另外,取得本月天数

select   datediff(day,cast(month(GetDate())asvarchar)+'-'+cast(month(GetDate())as

varchar)+'-15',cast(month(GetDate())asvarchar)+'-'+cast(month(GetDate())+1   asvarchar)

+'-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

sql日期操作

dumptransaction数据库withno_log

selectdatename(weekday,getdate())   获取当天的星期数

selectconvert(char(10),getdate(),21)

cast(@Today+''+@DutyTime_1asdatetime)字符串组合产生时间类型

ifexists(select1frommaster..sysdatabaseswherename='example')判断是否有记录存在

cast(ltrim(str(@thisyear,4))+'-'+ltrim(str(@thismonth,2))+'-'+'2100:

00:

00'asdatetime)

1.一个月第一天的

SelectDATEADD(mm,DATEDIFF(mm,0,getdate()),0)

2.本周的星期一

SelectDATEADD(wk,DATEDIFF(wk,0,getdate()),0)

3.一年的第一天

SelectDATEADD(yy,DATEDIFF(yy,0,getdate()),0)

4.季度的第一天

SelectDATEADD(qq,DATEDIFF(qq,0,getdate()),0)

5.当天的半夜

SelectDATEADD(dd,DATEDIFF(dd,0,getdate()),0)

6.上个月的最后一天

Selectdateadd(ms,-3,DATEADD(mm,DATEDIFF(mm,0,getdate()),0))

7.去年的最后一天

Selectdateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate()),0))

8.本月的最后一天

Selectdateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0))

9.本年的最后一天

Selectdateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate())+1,0))

10.本月的第一个星期一

selectDATEADD(wk,DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())),0)

返回当前日期和时间

通过函数GETDATE(),你可以获得当前的日期和时间。

函数GETDATE()可以用来作为DATEDIME型字段的缺省值。

这对插入记录时保存当时的时间是有用的。

要建立一个表,其中的记录包含有当前的日期和时间,可以添加一个DATETIME型字段,指定其缺省值为函数GETDATE()的返回值,就象这样:

CreateTABLEsite_log(

usernameVARCHAR(40),

useractivityVARCHAR(100),

entrydateDATETIMEDEFAULTGETDATE())

转换日期和时间

函数GETDATE()的返回值在显示时只显示到秒。

实际上,SQLSever内部时间可以精确到毫秒级(确切地说,可以精确到3.33毫秒)。

要得到不同格式的日期和时间,你需要使用函数CONVERT()。

例如,当下面的这个语句执行时,显示的时间将包括毫秒:

SelectCONVERT(VARCHAR(30),GETDATE(),9)

注意例子中数字9的使用。

这个数字指明了在显示日期和时间时使用哪种日期和时间格式。

当这个语句执行时,将显示如下的日期和时间:

Nov3019973:

29:

55:

170AM

(1row(s)affected)

在函数CONVERT()中你可以使用许多种不同风格的日期和时间格式。

下表显示了所有的格式。

日期和时间的类型:

类型值标准输出

0Defaultmonddyyyyhh:

miAM

1USAmm/dd/yy

2ANSIyy.mm.dd

3British/Frenchdd/mm/yy

4Germandd.mm.yy

5Italiandd-mm-yy

6-ddmonyy

7-mondd,yy

8-hh:

mi:

ss

9Default+milliseconds--monddyyyy

hh:

mi:

ss:

mmmAM(or)

10USAmm-dd-yy

11JAPANyy/mm/dd

12ISOyymmdd

13EuropeDefault+milliseconds--ddmonyyyy

hh:

mi:

ss:

mmm(24h)

14-hh:

mi:

ss:

mmm(24h)

类型0,9,和13总是返回四位的年。

对其它类型,要显示世纪,把style值加上100。

类型13和14返回24小时时钟的时间。

类型0,7,和13返回的月份用三位字符表示(用Nov代表November).

对表中所列的每一种格式,你可以把类型值加上100来显示有世纪的年(例如,00年将显示为2000年)。

例如,要按日本标准显示日期,包括世纪,你应使用如下的语句:

SelectCONVERT(VARCHAR(30),GETDATE(),111)

在这个例子中,函数CONVERT()把日期格式进行转换,显示为1997/11/30

抽取日期和时间

在许多情况下,你也许只想得到日期和时间的一部分,而不是完整的日期和时间。

为了抽取日期的特定部分,你可以使用函数DATEPART(),象这样:

Selectsite_name‘SiteName’,

DATEPART(mm,site_entrydate)‘MonthPosted’FROMsite_directory

函数DATEPART()的参数是两个变量。

第一个变量指定要抽取日期的哪一部分;第二个变量是实际的数据。

在这个例子中,函数DATEPART()抽取月份,因为mm代表月份。

下面是这个Select语句的输出结果:

SiteNameMonthPosted

………………………………………………………………

Yahoo2

Microsoft5

Magicw35

(3row(s)affected)

MonthPosted列显示了每个站点被查询的月份。

函数DATEPART()的返回值是一个整数。

你可以用这个函数抽取日期的各个不同部分,如下表所示。

日期的各部分及其简写

日期部分简写值

yearyy1753--9999

quarterqq1--4

monthmm1--12

dayofyeardy1--366

daydd1--31

weekwk1--53

weekdaydw1--7(Sunday--Saturday)

hourhh0--23

minutemi0--59

secondss0--59

milisecondms0--999

当你需要进行日期和时间的比较时,使用函数DATEPART()返回整数是有用的。

但是,上例中的查询结果(2,5)不是十分易读。

要以更易读的格式得到部分的日期和时间,你可以使用函数DATENAME(),如下例所示:

Selectsite_name‘SiteName’

DATENAME(mm,site_entrydate)‘MonthPosted’

FROMsite_directory

函数DATENAME()和函数DATEPART()接收同样的参数。

但是,它的返回

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2