sql中日期函数的用法   <script src="http://blog.csdn.net/count.aspx?ID=1920773&Type=Rank" type="text/javascript"></script>   

sql中日期函数的用法
 悬赏分:5 - 解决时间:2007-3-13 20:40
①DATEADD/DAY/DATEDIFF/GETDATE/DATENAME等函数的用法.
②想查询2007年2月9日的付款流水有单笔交易出现多张小票号的情况的小票号,该用什么语句?
提问者: 420329630 - 助理 二级
最佳答案
1.DateAdd ( I , N , D )
将一个日期加上一段期间后的日期。 I :设定一个日期( Date )所加上的一段期间的单位。譬如 interval="d" 表示 N的单位为日。 I的设定值如下:
yyyy Year 年
q Quarter 季
m Month 月
d Day 日
w Weekday 星期
h Hour 时
n Minute 分
s Second 秒
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 年
q Quarter 季
m Month 月
d Day 日
w Weekday 星期
h Hour 时
n Minute 分
s Second 秒
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-3 23:45
评价已经被关闭    目前有 0 个人评价
       好
50% (0) 不好
50% (0)

其他回答    共 1 条
DATEADD
在向指定日期加上一段时间的基础上,返回新的 datetime 值。

语法
DATEADD ( datepart , number, date )

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

语法
DATEDIFF ( datepart , startdate , enddate )

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

语法
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  脚本:  
       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

sql日期操作
dump transaction 数据库 with no_log

select  datename(weekday,getdate())    获取当天的星期数
select convert(char(10),getdate(),21)

cast(@Today+' '+@DutyTime_1 as datetime) 字符串组合产生时间类型
 
if exists(select 1 from master..sysdatabases where name='example') 判断是否有记录存在

cast( ltrim(str(@thisyear,4))+'-'+ltrim(str(@thismonth,2))+'-'+'21 00:00:00' as datetime)
1.一个月第一天的
Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

2.本周的星期一
Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

3.一年的第一天
Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

4.季度的第一天
Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

5.当天的半夜
Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

6.上个月的最后一天
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

7.去年的最后一天
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

8.本月的最后一天
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

9.本年的最后一天
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

10.本月的第一个星期一
select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

返回当前日期和时间
通过函数GETDATE(),你可以获得当前的日期和时间。函数GETDATE()可以用来作为DATEDIME型字段的缺省值。这对插入记录时保存当时的时间是有用的。要建立一个表,其中的记录包含有当前的日期和时间,可以添加一个DATETIME型字段,指定其缺省值为函数GETDATE()的返回值,就象这样:

Create TABLE site_log (
username VARCHAR(40),
useractivity VARCHAR(100),
entrydate DATETIME DEFAULT GETDATE())

转换日期和时间
函数GETDATE()的返回值在显示时只显示到秒。实际上,SQL Sever内部时间可以精确到毫秒级(确切地说,可以精确到3.33毫秒)。
要得到不同格式的日期和时间,你需要使用函数CONVERT()。例如,当下面的这个语句执行时,显示的时间将包括毫秒:

Select CONVERT(VARCHAR(30),GETDATE(),9)

注意例子中数字9的使用。这个数字指明了在显示日期和时间时使用哪种日期和时间格式。当这个语句执行时,将显示如下的日期和时间:
Nov 30 1997 3:29:55:170AM
(1 row(s) affected)

在函数CONVERT()中你可以使用许多种不同风格的日期和时间格式。下表显示了所有的格式。

日期和时间的类型:
类型值 标准 输出
0 Default mon dd yyyy hh:miAM
1 USA mm/dd/yy
2 ANSI yy.mm.dd
3 British/French dd/mm/yy
4 German dd.mm.yy
5 Italian dd-mm-yy
6 - dd mon yy
7 - mon dd,yy
8 - hh:mi:ss
9 Default + milliseconds--mon dd yyyy
hh:mi:ss:mmmAM(or )
10 USA mm-dd-yy
11 JAPAN yy/mm/dd
12 ISO yymmdd
13 Europe Default + milliseconds--dd mon yyyy
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年)。例如,要按日本标准显示日期,包括世纪,你应使用如下的语句:

Select CONVERT(VARCHAR(30),GETDATE(),111)

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

抽取日期和时间
在许多情况下,你也许只想得到日期和时间的一部分,而不是完整的日期和时间。为了抽取日期的特定部分,你可以使用函数DATEPART(),象这样:

Select site_name ‘Site Name’,
DATEPART(mm,site_entrydate) ‘Month Posted’ FROM site_directory

函数DATEPART()的参数是两个变量。第一个变量指定要抽取日期的哪一部分;第二个变量是实际的数据。在这个例子中,函数DATEPART()抽取月份,因为mm代表月份。下面是这个Select 语句的输出结果:

Site Name Month Posted
………………………………………………………………
Yahoo 2
Microsoft 5
Magicw3 5
(3 row(s) affected)

Month Posted列显示了每个站点被查询的月份。函数DATEPART()的返回值是一个整数。你可以用这个函数抽取日期的各个不同部分,如下表所示。

日期的各部分及其简写
日期部分 简写 值
year yy 1753--9999
quarter qq 1--4
month mm 1--12
day of year dy 1--366
day dd 1--31
week wk 1--53
weekday dw 1--7(Sunday--Saturday)
hour hh 0--23
minute mi 0--59
second ss 0--59
milisecond ms 0--999

当你需要进行日期和时间的比较时,使用函数DATEPART()返回整数是有用的。但是,上例中的查询结果(2,5)不是十分易读。要以更易读的格式得到部分的日期和时间,你可以使用函数DATENAME(),如下例所示:

Select site_name ‘Site Name’
DATENAME(mm,site_entrydate) ‘Month Posted’
FROM site_directory

函数DATENAME()和函数DATEPART()接收同样的参数。但是,它的返回值是一个字符串,而不是一个整数。下面是上例该用DATENAME()得到的结果:

Site Name Month Postec
………………………………………………………………….
Yahoo February
Microsoft June
Magicw3 June
(3 row(s) affected)

你也可以用函数DATENAE()来抽取一个星期中的某一天。下面的这个例子同时抽取一周中的某一天和日期中的月份:

Select site_name ‘Site Name’,
DATENAME(dw,site_entrydate)+ ‘-’ + DATENAME(mm,site_entrydate)
‘Day and Month Posted’ FORM site_directory

这个例子执行时,将返回如下的结果:

Site Name Day and Month Posted
………………………………………………………………………
Yahoo Friday - February
Microsoft Tuesday - June
Magicw3 Monday - June
(3 row(s) affected)

返回日期和时间范围
当你分析表中的数据时,你也许希望取出某个特定时间的数据。你也许对特定的某一天中――比如说2000年12月25日――访问者在你站点上的活动感兴趣。要取出这种类型的数据,你也许会试图使用这样的Select语句:

Select * FROM weblog Where entrydate="12/25/20000"

不要这样做。这个Select语句不会返回正确的记录――它将只返回日期和时间是12/25/2000 12:00:00:000AM的记录。换句话说,只有刚好在午夜零点输入的记录才被返回。

问题是SQL Sever将用完整的日期和时间代替部分日期和时间。例如,当你输入一个日期,但不输入时间时,SQL Sever将加上缺省的时间“12:00:00:000AM”。当你输入一个时间,但不输入日期时,SQL Sever将加上缺省的日期“Jan 1 1900”。
要返回正确的记录,你需要适用日期和时间范围。有不止一种途径可以做到这一点。例如,下面的这个Select 语句将能返回正确的记录:

Select * FROM weblog
Where entrydate>=”12/25/2000” AND entrydate<”12/26/2000”

这个语句可以完成任务,因为它选取的是表中的日期和时间大于等于12/25/2000 12:00:00:000AM并小于12/26/2000 12:00:00:000AM的记录。换句话说,它将正确地返回2000年圣诞节这一天输入的每一条记录。
另一种方法是,你可以使用LIKE来返回正确的记录。通过在日期表达式中包含通配符“%”,你可以匹配一个特定日期的所有时间。这里有一个例子:

Select * FROM weblog Where entrydate LIKE ‘Dec 25 2000%’

这个语句可以匹配正确的记录。因为通配符“%”代表了任何时间。
使用这两种匹配日期和时间范围的函数,你可以选择某个月,某一天,某一年,某个小时,某一分钟,某一秒,甚至某一毫秒内输入的记录。但是,如果你使用LIKE 来匹配秒或毫秒,你首先需要使用函数CONVERT()把日期和时间转换为更精确的格式(参见前面“转换日期和时间”一节)。

比较日期和时间
最后,还有两个日期和时间函数对根据日期和时间取出记录是有用的。使用函数DATEADD()和DATEDIFF(),你可以比较日期的早晚。例如,下面的Select语句将显示表中的每一条记录已经输入了多少个小时:

Select entrydate ‘Time Entered’
DATEDIFF(hh,entrydate,GETDATE()) ‘Hours Ago’ FROM weblog

如果当前时间是2000年11月30号下午6点15分,则会返回如下的结果:

Time Entered Hours Ago
…………………………………………………..
Dec 30 2000 4:09PM 2
Dec 30 2000 4:13PM 2
Dec 1 2000 4:09PM 698
(3 row(s) affected)

函数DADEDIFF()的参数是三个变量。第个变量指定日期的某一部分。在这个例子中,是按小时对日期进行比较,(要了解日期各部分的详细内容,请参考表11.2)在日期2000年11月1日和2000年11月30日的指定时间之间有689个小时。另外两个参数是要进行比较的时间。为了返回一个正数,较早的时间应该先给。
函数DATEADD()把两个日期相加。当你需要计算截止日期这一类的数据时,这个函数是有用处的。假如你要查询一个月前注册用户的记录,你可以使用如下的Select语句:

Select username ‘User Name’,
DATEADD(mm,1,firstvisit_date) ‘Registration Expires’
FROM registration_table

函数DATEADD()的参数有三个变量。第一个变量代表日期的某一部分,这个例子用到了代表月份的mm。第二个变量指定了时间的间隔――在本例中是一个月。最后一个变量是一个日期,在这个例子中,日期是取自DATETIME型字段firstvisit_date.假设当前日期是June 30,2000,这个语句将返回如下的内容:

User Name Registration Expires
……………………………………………………………………………
Bill Gates Jul 30 2000 4:09PM
President Clinton Jul 30 2000 4:13PM
William Shakespeare Jul 1 2000 4:09PM
(3 row(s) affected)

注意:
使用函数DATEADD()把一个日期加上一个月,它并不加上30天。这个函数只简单地把月份值加1。

函数 参数/功能
GetDate( )  返回系统目前的日期与时间
DateDiff (interval,date1,date2) 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1
DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期
DatePart (interval,date) 返回日期date中,interval指定部分所对应的整数值
DateName (interval,date) 返回日期date中,interval指定部分所对应的字符串名称

参数 interval的设定值如下:

值 缩 写(Sql Server) Access 和 ASP 说明
Year Yy yyyy 年 1753 ~ 9999
Quarter Qq q   季 1 ~ 4
Month Mm m   月1 ~ 12
Day of year Dy y  一年的日数,一年中的第几日 1-366
Day Dd d   日,1-31
Weekday Dw w 一周的日数,一周中的第几日 1-7
Week Wk ww  周,一年中的第几周 0 ~ 51
Hour Hh h   时0 ~ 23
Minute Mi n  分钟0 ~ 59
Second Ss s 秒 0 ~ 59
Millisecond Ms - 毫秒 0 ~ 999

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1920773

1.===============================================
获取getdate()当月的每个星期天,sql查询语句
2007-05-25 18:46
select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate()) ), -1)
union all select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate()) ), 6)
union all select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate()) ), 13)
union all select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate()) ), 20)

2,有个兄弟的问题和我的一样,先暂时保存这个地址了:

如何获得定量日期,(星期六,星期天除外) 难!难!

http://topic.csdn.net/t/20040701/13/3137476.html

如何获得定量日期,(星期六,星期天除外) 难!难!

如果从某天开始计算,如何获得一段时间间隔后的日期?  
      列如:  
       July-01-2004   是星期四,   8个工作日后July-13-2004.   (星期六,星期天除外).  
     如何获得间隔后的日期?

1============
    select   dateadd(day,8+(case   datepart(weekday,dateadd(day,8,getdate()))   when   1   then   1  
            when   7   then   2   else   0   end),getdate())

2=============

declare   @i   int,@dt   datetime  
   
  set   @dt=getdate()     --要处理的日期  
  set   @i=7 --要增加的工作天数  
   
  select   dateadd(week,@i/5,@dt)+@i%5  
  +case   datepart(weekday,@dt+@i%5)   when   1   then   1   when   7   then   2   else   0   end

3=====================

--写成存储过程:  
  CREATE   procedure   sp_dateadd   @starttime   datetime,@days   int,@date   datetime   output  
  as  
  select   @date=dateadd(day,@days/5*7-1,@starttime),@days=@days-@days/5*5  
  while   @days<>0  
  begin  
      set   @date=dateadd(day,1,@date)  
      if   datepart(dw,@date)<>1   and   datepart(dw,@date)<>7  
          set   @days=@days-1  
  end  
  GO  
  --调用  
  declare   @date   datetime  
  exec   sp_dateadd   '2004-7-1',8,@date   output  
  print   @date

44============================
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[f_dateadd]')   and   xtype   in   (N'FN',   N'IF',   N'TF'))  
  drop   function   [dbo].[f_dateadd]  
  GO  
   
  --写个函数  
  create   function   f_dateadd(  
  @dt   datetime, --要添加的日期  
  @workday   int --要增加的工作天数  
  )returns   datetime  
  as  
  begin  
  declare   @i   int  
  select   @i=case   when   @workday>0   then   1   else   -1   end  
  ,@dt=dateadd(week,@workday/5,@dt)  
  ,@workday=@workday%5  
  while   @workday<>0  
  select   @dt=dateadd(day,@i,@dt)  
  ,@workday=case   when   datepart(weekday,@dt)   in(1,7)    
  then   @workday   else   @workday-@i   end  
  return(@dt)  
  end  
  go  
   
  --调用函数  
  select   dbo.f_dateadd(getdate(),8)

try   :  
  declare   @date1   datetime,@date2   datetime,@n   int,@m   int  
  set   @date1='2004-07-01'  
  set   @date2='2004-12-31'  
  set   @n=0  
  set   @m=8  
  while   @date1<=@date2  
  begin  
    if     datepart(weekday,@date1)>1   and     datepart(weekday,@date1)<7       set   @n=@n+1  
    if     @n<=@m     select   @date1=@date1+1     else   break  
  end  
  print   @date1

5=============================
--修正了我上面写的那个中的一些BUG  
   
  if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[f_dateadd]')   and   xtype   in   (N'FN',   N'IF',   N'TF'))  
  drop   function   [dbo].[f_dateadd]  
  GO  
   
  /*--增加天数的函数  
   
  指定日期添加/减少指定工作天数后的日期  
  @workday   为正数表示增加天数,为负数表示减少天数  
  如果   @dt   是周六,周日,而   @workday=0  
  则返回   >@dt   的第一个工作日  
   
  --邹建   2004.07--*/  
  create   function   f_dateadd(  
  @dt   datetime, --要添加的日期  
  @workday   int --要增加的工作天数  
  )returns   datetime  
  as  
  begin  
  declare   @i   int  
  select   @i=case   when   @workday<0   then   -1   else   1   end  
  ,@dt=dateadd(week,@workday/5,@dt)  
  ,@workday=@workday%5  
  while   @workday<>0    
  select   @dt=dateadd(day,@i,@dt)  
  ,@workday=case   when   datepart(weekday,@dt)   in(1,7)    
  then   @workday   else   @workday-@i   end  
  while   datepart(weekday,@dt)   in(1,7)    
  select   @dt=dateadd(day,@i,@dt)  
  return(@dt)  
  end  
  go  
   
  --调用函数  
  select   dbo.f_dateadd('2004-7-18',0)

6-===========================================

写了存储过程,不过只支持正的天数量  
  CREATE   procedure   sp_test   @startDate   datetime,@days   int,@endDate   datetime   output  
  as  
  declare     @i   int  
  set   @endDate=@startDate  
  set   @i=1  
  while   @i<=@days  
    begin  
        set   @endDate=dateadd(d,1,@endDate)  
        if   datepart(weekday,@endDate)=7  
                set   @endDate=dateadd(d,1,@endDate)  
        else   if   datepart(weekday,@endDate)=1    
        begin  
                set   @endDate=dateadd(d,1,@endDate)  
                set   @i=@i+1  
        end  
        else  
                set   @i=@i+1  
    end  
   
  ---------------  
  --调用  
  declare   @date   datetime  
  exec   sp_test   '2004-7-3',1,@date   output  
  print   @date  
   
  --结果  
  07     5   2004   12:00AM

sql中日期函数的用法相关推荐

  1. SQL中object_id函数的用法

    SQL中object_id函数的用法 收藏  int object_id('objectname'); 此方法返回数据库对象标识号. 其中,参数objectname 表示要使用的对象,其数据类型为nc ...

  2. SQL中 ROW_NUMBER 函数的用法

    SQL中 ROW_NUMBER 函数的用法 ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号.在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是 ...

  3. SQL中decode函数的用法

    SQL中decode函数的用法 2008-07-30 17:11:14 本文已公布到博客频道职场·创业分类 DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司 ...

  4. sql中decode(...)函数的用法

    sql中decode(...)函数的用法 相当于if语句 decode函数比较1个参数时 SELECT ID,DECODE(inParam,'beComparedParam','值1' ,'值2') ...

  5. SQL中日期函数的运用

    ## 给一个日期加上一天 select DATEADD(DAY,1,GETDATE()):给表中的日期列加上一天:DATEADD(DAY,1,日期) 当然,这个函数不止能单一的实现,语法其实是DATE ...

  6. SQL SERVER日期函数详细用法

    1.一个月第一天的 Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 Select DATEADD(wk, DATEDIFF(wk,0, ...

  7. Sql Server REPLACE函数的使用;SQL中 patindex函数的用法

    Sql Server REPLACE函数的使用 REPLACE 用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式. 语法 REPLACE ( ''string_replace1' ...

  8. SQL中TRUNC函数的用法

    TRUNC函数用于对值进行截断. 用法有两种:TRUNC(NUMBER)表示截断数字,TRUNC(date)表示截断日期. (1)截断数字: 格式:TRUNC(n1,n2),n1表示被截断的数字,n2 ...

  9. SQL中CONVERT函数全部用法对日期操作

    格式: CONVERT(data_type,expression[,style]) 说明: (datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,var ...

最新文章

  1. 转:并口编程参考资料
  2. 如何分辨 SAP Fiori Launchpad 里的真假 Fiori 应用
  3. matlab aviobj,MATLAB AVI 视频读取处理
  4. Hadoop:HDFS的概念理解和体系架构-成都加米谷大数据分享
  5. mysql-电商库演练1-创建数据-基本查询练习
  6. mysql 查询和修改组合_## 超详细MySQL常用语句,增删查改
  7. 微信小程序WXML语法介绍
  8. 惩罚函数外点matlab,禁忌搜索算法求解带时间窗的车辆路径问题(惩罚函数版 附MATLAB代码)...
  9. HTTP Status 404(The requested resource is not available)
  10. fcpx教程从入门到精通「3」预览窗口的认识
  11. linux基础网络设置及使用DHCP动态配置主机地址
  12. 软件项目管理案例教程第四版 答案
  13. 第九届大唐杯省赛知识梳理-5G协议与信令(20%)
  14. 8.用C/C++实现一个科学计算器———(超级详细完整,包含C/C++版本和Qt版本)
  15. 计算机专业报瑞士酒店管理,我适合去瑞士读酒店管理吗?
  16. LiveMedia视频平台与第三方国标平台级联对接异常断流
  17. vue webpack打包名称设置
  18. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛(同步赛) 点对最大值 dp
  19. Wps文档如何转换为pdf文件
  20. 常用的unicode编码图形

热门文章

  1. 阿里云弹性裸金属服务器规格族详解和使用场景
  2. 2022春夏五大系列新品亮相,都市丽人构建多层次的产品矩阵
  3. Android Back回退按钮
  4. Android用yasea 推流异常AmfString cannot be cast to com.github.faucamp.simplertmp.amf.AmfNumber捕获和解决
  5. 总是想起一首歌:多么痛的领悟
  6. 指针类型和指向的数据类型
  7. 东方财富板块资金python抓取
  8. JAVA C~K的班级
  9. 【极坐标下牛顿—拉夫逊潮流计算(matlab版+python版)】
  10. ADC模数转换器工作原理及分类