特殊日期加减函数

  

  对于日期指定部分的加减,使用DATEADD函数就可以轻松实现。但在实际的处理中,还有一种比较另类的日期加减处理,就是在指定的日期中,加上(或者减去)多个日期部分。比如将2010年12月9日,加上1年3个月11天2小时。对于这种日期的加减处理,DATEADD函数的力量就显得有点不足。

 

  本函数实现这样格式的日期字符串加减处理:
   y-m-d h:m:s.m | -y-m-d h:m:s.m
   下面是全部SQL代码:

特殊日期加减函数
 
   
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

/* --调用示例
要加减的日期字符输入方式与日期字符串相同。日期与时间部分用空格分隔
最前面一个字符如果是减号(-)的话,表示做减法处理,否则做加法处理。
如果日期字符只包含数字,则视为日期字符中,仅包含天的信息。
eg:SELECT dbo.f_DateADD(GETDATE(),'11:10')
--
*/
CREATE FUNCTION dbo.f_DateADD(
@Date datetime ,
@DateStr varchar ( 23 )
)
RETURNS datetime
AS
BEGIN
DECLARE @bz int , @s varchar ( 12 ), @i int

IF @DateStr IS NULL OR @Date IS NULL
OR ( CHARINDEX ( ' . ' , @DateStr ) > 0
AND @DateStr NOT LIKE ' %[:]%[:]%.% ' )
RETURN ( NULL )
IF @DateStr = '' RETURN ( @Date )

SELECT @bz = CASE
WHEN LEFT ( @DateStr , 1 ) = ' - ' THEN - 1
ELSE 1 END ,
@DateStr = CASE
WHEN LEFT ( @Date , 1 ) = ' - '
THEN STUFF ( RTRIM ( LTRIM ( @DateStr )), 1 , 1 , '' )
ELSE RTRIM ( LTRIM ( @DateStr )) END

IF CHARINDEX ( ' ' , @DateStr ) > 1
OR CHARINDEX ( ' - ' , @DateStr ) > 1
OR ( CHARINDEX ( ' . ' , @DateStr ) = 0
AND CHARINDEX ( ' : ' , @DateStr ) = 0 )
BEGIN
SELECT @i = CHARINDEX ( ' ' , @DateStr + ' ' )
,
@s = REVERSE ( LEFT ( @DateStr , @i - 1 )) + ' - '
,
@DateStr = STUFF ( @DateStr , 1 , @i , '' )
,
@i = 0
WHILE @s > '' and @i < 3
SELECT @Date = CASE @i
WHEN 0 THEN DATEADD ( Day , @bz * REVERSE ( LEFT ( @s , CHARINDEX ( ' - ' , @s ) - 1 )), @Date )
WHEN 1 THEN DATEADD ( Month , @bz * REVERSE ( LEFT ( @s , CHARINDEX ( ' - ' , @s ) - 1 )), @Date )
WHEN 2 THEN DATEADD ( Year , @bz * REVERSE ( LEFT ( @s , CHARINDEX ( ' - ' , @s ) - 1 )), @Date )
END ,
@s = STUFF ( @s , 1 , CHARINDEX ( ' - ' , @s ), '' ),
@i = @i + 1
END
IF @DateStr > ''
BEGIN
IF CHARINDEX ( ' . ' , @DateStr ) > 0
SELECT @Date = DATEADD (Millisecond
,
@bz * STUFF ( @DateStr , 1 , CHARINDEX ( ' . ' , @DateStr ), '' ),
@Date ),
@DateStr =LEFT ( @DateStr , CHARINDEX ( ' . ' , @DateStr ) - 1 ) + ' : ' ,
@i = 0
ELSE
SELECT @DateStr = @DateStr + ' : ' , @i = 0
WHILE @DateStr > '' and @i < 3
SELECT @Date = CASE @i
WHEN 0 THEN DATEADD (Hour, @bz *LEFT ( @DateStr , CHARINDEX ( ' : ' , @DateStr ) - 1 ), @Date )
WHEN 1 THEN DATEADD (Minute, @bz *LEFT ( @DateStr , CHARINDEX ( ' : ' , @DateStr ) - 1 ), @Date )
WHEN 2 THEN DATEADD (Second, @bz *LEFT ( @DateStr , CHARINDEX ( ' : ' , @DateStr ) - 1 ), @Date )
END ,
@DateStr = STUFF ( @DateStr , 1 , CHARINDEX ( ' : ' , @DateStr ), '' ),
@i = @i + 1
END

RETURN ( @Date )
END
GO

 

转载于:https://www.cnblogs.com/hysoft/archive/2010/12/09/1901535.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值