这可以使用自定义代码,如下面做 - 我假设你使用的是人的年龄的价值观,和你他们正在努力根据他们今天的年龄制定出生日期。
你可以看到在行动下面的代码在这里:http://sqlfiddle.com/#!3/c757c/2
create function dbo.AgeToDOB(@age nvarchar(32))
returns datetime
as
begin
declare @pointer int = 0
, @pointerPrev int = 1
, @y nvarchar(6)
, @m nvarchar(6)
, @w nvarchar(6)
, @d nvarchar(6)
, @result datetime = getutcdate() --set this to the date we're working to/from
--convert various ways of expressing units to a standard
set @age = REPLACE(@age,'Years','Y')
set @age = REPLACE(@age,'Year','Y')
set @age = REPLACE(@age,'Months','M')
set @age = REPLACE(@age,'Month','M')
set @age = REPLACE(@age,'Weeks','W')
set @age = REPLACE(@age,'Week','W')
set @age = REPLACE(@age,'Days','D')
set @age = REPLACE(@age,'Day','D')
set @pointer = isnull(nullif(CHARINDEX('Y',@age),0),@pointer)
set @y = case when @pointer > @pointerprev then SUBSTRING(@age,@pointerprev,@pointer - @pointerprev) else null end
set @pointerPrev = @pointer + 1
set @pointer = isnull(nullif(CHARINDEX('M',@age),0),@pointer)
set @m = case when @pointer > @pointerprev then SUBSTRING(@age,@pointerprev,@pointer - @pointerprev) else null end
set @pointerPrev = @pointer + 1
set @pointer = isnull(nullif(CHARINDEX('W',@age),0),@pointer)
set @w = case when @pointer > @pointerprev then SUBSTRING(@age,@pointerprev,@pointer - @pointerprev) else null end
set @pointerPrev = @pointer + 1
set @pointer = isnull(nullif(CHARINDEX('D',@age),0),@pointer)
set @d = case when @pointer > @pointerprev then SUBSTRING(@age,@pointerprev,@pointer - @pointerprev) else null end
set @result = dateadd(YEAR, 0 - isnull(cast(@y as int),0), @result)
set @result = dateadd(MONTH, 0 - isnull(cast(@m as int),0), @result)
set @result = dateadd(Week, 0 - isnull(cast(@w as int),0), @result)
set @result = dateadd(Day, 0 - isnull(cast(@d as int),0), @result)
return @result
end
go
select dbo.AgeToDOB('20 Years 8 Months 3 Weeks')
注:有很多的余地这里优化;我已经把它简单地放在了上面,以帮助保持清楚发生了什么。
,你会'61年8月4 Weeks'期待什么如同'datetime'?甚至不清楚一年或一个月有多少天。什么是“零时间”?是否应该从这个'datetime'中减去或添加时间? –
没有。这是不可能的。那些不是日期。他们是持续时间或时间段。你需要知道“基准时间”(aka epoch)是什么,所以你可以这样做,那些日期是相对的。例如jan 1 1980 + 20 years + 8 months + 3 weeks =你想要保存在db中的实际日期。 –
有一些调整是可能的 - 但为了将上述内容转换成日期,你需要表达它应该如何成为一个约会 - 也就是说,它是20年,8个月和3周以来/直到什么时候? – JohnLBevan