`

SQL中的DateAdd()

阅读更多
MS SQL Server中DATEADD和DATEDIFF的用法
2009-11-23 09:52


DATEADD(datepart,number,date)
date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。

datepart 参数可以是下列的值:

datepart 缩写
年 yy, yyyy
季度 qq, q
月 mm, m
年中的日 dy, y
日 dd, d
周 wk, ww
星期 dw, w
小时 hh
分钟 mi, n
秒 ss, s
毫秒 ms
微妙 mcs
纳秒 ns


固定日期减一个月(日、年)
dateadd(表达式1,表达式2,表达式3)
表达式1为MM或YY或DD
表达式2为1
表达式3为要减的日期

一个月的第一天

第一个例子,我将告诉你如何从当前日期去这个月的最后一天。请注意:这个例子以及这篇文章中的其他例子都将只使用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函数计算你程序可能要用到的日期时。

---------------------------------------------------------------

附录,其他日期处理方法

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))

----------------------------------------------------------------------------------------------------------------------------

定义和用法
DATEADD() 函数在日期中添加或减去指定的时间间隔。

语法
DATEADD(datepart,number,date)
date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。

datepart 参数可以是下列的值:

datepart 缩写
年 yy, yyyy
季度 qq, q
月 mm, m
年中的日 dy, y
日 dd, d
周 wk, ww
星期 dw, w
小时 hh
分钟 mi, n
秒 ss, s
毫秒 ms
微妙 mcs
纳秒 ns


可以使用 DateAdd 函数对日期加上或减去指定的时间间隔。例如,可以用 DateAdd 来计算距今天为三十天的日期;或者计算距现在为 45 分钟的时间。

为了对 date 加上“日”,可以使用“一年的日数” (“y”),“日” (”d”) 或“一周的日数” (”w”)。

DateAdd 函数将不返回有效日期。在以下实例中将 1 月31 日加上一个月:

DateAdd(m, 1, 31-Jan-95)

上例中,DateAdd 返回 1995 年 2 月 28 日,而不是 1995 年 2 月 31 日。如果 date 是 1996 年 1 月 31 日,则由于 1996 年是闰年,返回值是 1996 年 2 月 29 日。

如果计算的日期超前 100 年(减去的年度超过 date 中的年份),就会导致错误发生。

如果 number 不是一个 Long 值,则在计算时取最接近的整数值来计算。

注意   DateAdd 返回值的格式由 Control Panel设置决定,而不是由传递到date 参数的格式决定。

--------------------------------------------------------------------------------------------------------------------------------

DateDiff函数 是一个非常有用的函数,它可以为一些网页做一些特殊的效果.
    我就曾用到它和一张'new'字样的图片 来区别网页显示的信息是否为最近的信息.
例如:提示最近的通知,最近的新闻等等.
    下面从DateDiff函数的定义来看看:

DateDiff函数返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目。

语法

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])

DateDiff 函数语法中有下列命名参数:

部分 描述

interval 必要。字符串表达式,表示用来计算date1 和 date2 的时间差的时间间隔

Date1□date2 必要;Variant (Date)。计算中要用到的两个日期。

Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。

firstweekofyear 可选。指定一年的第一周的常数。如果未予指定,则以包含 1 月 1 日的星期为第一周。

设置

interval 参数的设定值如下:

设置 描述

yyyy 年

q 季

m 月

y 一年的日数

d 日

w 一周的日数

ww 周

h 时

n 分钟

s 秒

firstdayofweek 参数的设定值如下:

常数 值 描述

vbUseSystem 0 使用 NLS API 设置。

vbSunday 1 星期日(缺省值)

vbMonday 2 星期一

vbTuesday 3 星期二

vbWednesday 4 星期三

vbThursday 5 星期四

vbFriday 6 星期五

vbSaturday 7 星期六

常数 值 描述

vbUseSystem 0 用 NLS API 设置。

vbFirstJan1 1 从包含 1 月 1 日的星期开始(缺省值)。

vbFirstFourDays 2 从第一个其大半个星期在新的一年的一周开始。

vbFirstFullWeek 3 从第一个无跨年度的星期开始。

说明

DateDiff 函数可用来决定两个日期之间所指定的时间间隔数目。例如,可以使用 DateDiff 来计算两个日期之间相隔几日,或计算从今天起到年底还有多少个星期。

为了计算 date1 与 date2 相差的日数,可以使用“一年的日数”(y) 或“日”(d)。当 interval 是“一周的日数”(w) 时,DateDiff 返回两日期间的周数。如果 date1 是星期一,DateDiff 计算到 date2 为止的星期一的个数。这个数包含 date2 但不包含 date1。不过,如果 interval 是“周”(ww),则 DateDiff 函数返回两日期间的“日历周”数。由计算 date1 与 date2 之间星期日的个数而得。如果 date2 刚好是星期日,则 date2 也会被加进 DateDiff 的计数结果中;但不论 date1 是否为星期日,都不将它算进去。

如果 date1 比 date2 来得晚,则 DateDiff 函数的返回值为负数。

firstdayofweek 参数会影响使用时间间隔符号 “W” 或 “WW” 计算的结果。

如果 date1 或 date2 是日期文字,则指定的年份成为该日期的固定部分。但是,如果 date1 或 date2 用双引号 (" ") 括起来,且年份略而不提,则在每次计算表达式 date1 或 date2 时,当前年份都会插入到代码之中。这样就可以书写适用于不同年份的程序代码。

在计算 12 月 31 日和来年的 1 月 1 日的年份差时,DateDiff 返回 1 表示相差一个年份,虽然实际上只相差一天而已。

分享到:
评论

相关推荐

    SQL中DATEADD和DATEDIFF的用法

    DATEADD 和 DATEDIFF 函数是 SQL 中两个非常重要的函数,它们可以帮助我们计算和处理日期相关的问题。在本文中,我们将详细介绍 DATEADD 和 DATEDIFF 函数的用法,包括它们的定义、语法、参数、返回值、使用示例等...

    SQL中DATEADD和DATEDIFF的用法示例介绍

    主要介绍了SQL中DATEADD和DATEDIFF的用法,需要的朋友可以参考下

    模拟SQLSERVER的两个函数:dateadd(),datediff()

    /****模拟sqlserver中的dateadd函数*******$part 类型:string取值范围:year,month,day,hour,min,sec表示:要增加的日期的哪个部分$n 类型:数值表示:要增加多少,根据$part决定增加哪个部分可为负数$datetime类型...

    sqlserver中日期型字段设默认值

    sqlserver中日期型字段设默认值默认值

    C#程序设计-3期(KC008) KC008110100010-在SQL语句中使用DATEADD函数向指定日期添加一段时间间隔.

    C#程序设计-3期(KC008) KC008110100010-在SQL语句中使用DATEADD函数向指定日期添加一段时间间隔.docx 学习资料 复习资料 教学资源

    dateadd与datediff时间段查询代码

    dateadd与datediff时间段查询代码,我给公司做项目时候用过此方法,比较管用啊。

    【SQL高级(十)】【SQL Date 函数+SQL Date 数据类型】

    上一篇:【SQL高级(九)】【SQL AUTO INCREMENT 字段+SQL 视图(Views)】 文章目录SQL Date 函数MySQL Date 函数NOW...函数DATEADD() 函数DATEDIFF() 函数CONVERT() 函数SQL Date 数据类型 SQL Date 函数 处理日期时,

    sqlserver自定义函数

    学习与做项目中总结的几个实用的sqlserver 函数 希望对大家有帮助 --确定某年某月有多少天 Create FUNCTION DaysInMonth ( @date datetime ) Returns int AS BEGIN RETURN Day(dateadd(mi,-3,DATEADD(m, DATEDIFF...

    SQL日期的方法及例子

    SQL中查询日期的一些方法。包括取得当月月末最后一天,等用法 细的说明: 通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期...

    ASP中DateAdd函数中日期相加或相减使用方法

    ASP中DateAdd函数用法 2006/09/22 12:29 注意vbs中和sql中写法略有不同,以下帖出的为vbs帮助。 sql的可搜索sql自带帮助文档 字符串表达式,表示要添加的时间间隔。有关数值,请参阅”设置”部分。 返回已添加指定...

    SQL Server日期加减函数DATEDIFF与DATEADD用法分析

    本文实例讲述了SQL Server日期加减函数DATEDIFF与DATEADD用法。分享给大家供大家参考,具体如下: SQL Server 日期的加减函数: DATEDIFF DATEADD DATEDIFF: 返回跨两个指定日期的日期边界数和时间边界数, 语法:...

    Access常用内置SQL函数

    一、Access常用内置SQL函数---日期时间函数 1.CDate 说明:将字符串转化成为日期 举例:select CDate("2008/4/5") 2.Date 说明:返回当前日期 举例:select Date() 3.DateAdd 说明:将指定日期加上某个日期 举例:...

    sql最全的常用命令语句

    --查看缓存中重用次数少,占用内存大的查询语句(当前缓存中未释放的)--全局 SELECT TOP 100 usecounts, objtype, p.size_in_bytes,[sql].[text] FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_...

    sqlserver日期时间函数[参考].pdf

    SQL Server 中的日期和时间函数是非常重要的一部分,它们可以帮助我们更好地处理日期和时间相关的数据。在 SQL Server 中,有多种日期和时间函数,每种函数都有其特定的功能和用途。在这里,我们将详细介绍 SQL ...

    SQL语句中常用的函数大全

    列举了SQL语句中大部分常用的函数 Abs(number) 取得数值的绝对值。 Asc(String) 取得字符串表达式的第一个字符ASCII 码。 Atn(number) 取得一个角度的反正切值。 CallByName (object, procname, usecalltype,[args...

    SQL SERVER 2008分区表快速创建.doc

    SQL Server 2008 分区表快速创建是指在 SQL Server 2008 环境中快速创建分区表的过程。分区表是指将大型表分割成多个小表,以提高查询性能和数据管理效率。下面是快速创建分区表的步骤和相关代码脚本。 一、定义...

    SQL 标量函数----->日期函数 day() 、month()、year()、DATEADD()、ATEDIFF()、DATENAME()、DATEPART() GETDATE()

    SQL 标量函数----->日期函数 day() 、month()、year()、DATEADD()、ATEDIFF()、DATENAME()、DATEPART() GETDATE()

Global site tag (gtag.js) - Google Analytics