zoukankan
html css js c++ java
Sql Server 特殊日期加减函数
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
/**/
/*
--特殊日期加减函数
对于日期指定部分的加减,使用DATEADD函数就可以轻松实现。
在实际的处理中,还有一种比较另类的日期加减处理
就是在指定的日期中,加上(或者减去)多个日期部分
比如将2005年3月11日,加上1年3个月11天2小时。
对于这种日期的加减处理,DATEADD函数的力量就显得有点不够。
本函数实现这样格式的日期字符串加减处理:
y-m-d h:m:s.m | -y-m-d h:m:s.m
说明:
要加减的日期字符输入方式与日期字符串相同。日期与时间部分用空格分隔
最前面一个字符如果是减号(-)的话,表示做减法处理,否则做加法处理。
如果日期字符只包含数字,则视为日期字符中,仅包含天的信息。
--
*/
/**/
/*
--调用示例
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
查看全文
相关阅读:
数学之道-微积分
mysql join实现方式
python pip源配置
python使用tesseract-ocr完成验证码识别
Linux和Windows下查看环境变量方法对比
把大象装进冰箱的N种方法
mysql 取当前日期对应的周一或周日
window 安装 Twisted 遇到的问题
Java泛型
Android之Adapter用法总结
原文地址:https://www.cnblogs.com/nosnowwolf/p/1135551.html
最新文章
RESTful、共用接口、前后端分离、接口约定的实践 (转)
java:线上问题排查常用手段(转)
Java回调实现异步 (转)
文章地址索引
JDK 监控和故障处理工具总结 (转)
Spring的事务传播机制实例 (转)
RPC 框架 介绍 (转)
java基础: synchronized与Lock的区别
java基础:强引用、弱引用、软引用和虚引用 (转)
AES不同语言加密解密
热门文章
Spring Boot异步发送邮件和请求拦截器配置
Disruptor分布式id生成策略
Java 线程状态
java 正则和连接json
java 获取手机归属地,引起net.UnknownHostException错误
Disruptor与Netty实现百万级(十)
Spring Boot(二)
JavaNetty心跳监控
Disruptor底层源码解析(九)
Most efficient way to get the last element of a stream
Copyright © 2011-2022 走看看