我对存储过程的输入是一个字符串(例如“2 年 3 个月 4 天”),它是一个未来的日期。如何通过与当前日期比较将其转换为日期?
问问题
4590 次
4 回答
1
declare @S varchar(50)
set @S = '2 years 3 months 4 days'
select dateadd(day, D.D, dateadd(month, D.M, dateadd(year, D.Y, getdate()))) as TheDate
from (select replace(replace(replace(@S, ' years ', '.'), ' months ', '.'), ' days', '')) as T(S)
cross apply (
select cast(parsename(T.S, 1) as int),
cast(parsename(T.S, 2) as int),
cast(parsename(T.S, 3) as int)Y
) as D(D, M, Y)
于 2013-09-28T14:26:36.830 回答
0
您可以在 SP 中使用以下查询
select dateadd(yy,2,dateadd(m,3,dateadd(d,4,GETDATE())))
^Year ^Month ^Days
这里是SP
create procedure test1
(
@year INT,
@month INT,
@day INT
)
AS
BEGIN
select dateadd(yy,@year,dateadd(m,@month,dateadd(d,@day,GETDATE())))
END
于 2013-09-28T13:55:27.243 回答
-1
例如,使用DATEADD
(将一年添加到当前数据):
DECLARE @datetime2 datetime2 = getdate();
SELECT 'year', DATEADD(year,1,@datetime2)
...
因此,您应该在当前日期上加上 2 年 3 个月 4 天,然后将其作为正常日期返回(这里我返回了未来年份)。阅读此处了解详细信息。
在存储过程调用之前,您应该使用 PHP 等服务器端语言拆分字符串:
$str = '2 years 3 months 4 days';
preg_match_all('!\d+!', $str, $data);
所以$data[0]=2, $data[1]=3
和$data[2] = 4
,所以你可以调用@Luv 过程:
create procedure test1 -- thanks to Luv
(
@year INT,
@month INT,
@day INT
)
AS
BEGIN
select dateadd(yy,@year,dateadd(m,@month,dateadd(d,@day,GETDATE())))
END
于 2013-09-28T13:40:42.113 回答
-4
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html 将秒转换为人类可读的持续时间
您也许可以将此格式拆分并转换为可通过内置 SQL 函数使用的格式 - 但我建议至少使用 PHP 等预处理脚本语言来正确格式化时间,PHP“相对”格式可能就这样吧,我记得日期时间类非常强大......
http://www.php.net/manual/en/datetime.construct.php
http://www.php.net/manual/en/datetime.formats.relative.php
http://www.php.net/手册/en/datetime.formats.compound.php
于 2013-09-28T13:47:59.070 回答