Squ*_*3lz 8 sql sql-server datediff
我收到报告,其中数据ETL自动发送到数据库.我提取并转换了一些数据,将其加载到其他地方.我需要做的一件事是a,DATEDIFF但年份需要准确(即4.6年,而不是四舍五入.
以下是我的脚本:
select *, DATEDIFF (yy, Begin_date, GETDATE()) AS 'Age in Years'
from Report_Stage;
Run Code Online (Sandbox Code Playgroud)
该'Age_In_Years'列正在舍入.我如何获得多年的确切日期?
Nic*_*rey 14
所有这些datediff()都是计算日期之间交叉的期间边界的数量.例如
datediff(yy,'31 Dec 2013','1 Jan 2014')
Run Code Online (Sandbox Code Playgroud)
返回1.
如果计算两个日期之间的差异,并且除以一个日历年的平均长度(以400天为单位的天数)(365.2425),您将获得更准确的结果:
datediff(day,{start-date},{end-date},) / 365.2425
Run Code Online (Sandbox Code Playgroud)
例如,
select datediff(day,'1 Jan 2000' ,'18 April 2014') / 365.2425
Run Code Online (Sandbox Code Playgroud)
返回14.29461248- 将其四舍五入到所需的精度.
Fum*_*ode 10
您是否尝试过几个月来改变差异,然后以这种方式计算年数?例如30个月/ 12年将是2.5年.
编辑:此SQL查询包含几种计算日期差异的方法:
SELECT CONVERT(date, GetDate() - 912) AS calcDate
,DATEDIFF(DAY, GetDate() - 912, GetDate()) diffDays
,DATEDIFF(DAY, GetDate() - 912, GetDate()) / 365.0 diffDaysCalc
,DATEDIFF(MONTH, GetDate() - 912, GetDate()) diffMonths
,DATEDIFF(MONTH, GetDate() - 912, GetDate()) / 12.0 diffMonthsCalc
,DATEDIFF(YEAR, GetDate() - 912, GetDate()) diffYears
Run Code Online (Sandbox Code Playgroud)
我认为除以 365.2425 不是一个好方法。没有任何部门可以完全准确地做到这一点(使用 365.25 也有问题)。
我知道以下脚本可以计算准确的日期差异(尽管可能不是最快捷的方式):
declare @d1 datetime ,@d2 datetime
--set your dates eg:
select @d1 = '1901-03-02'
select @d2 = '2016-03-01'
select DATEDIFF(yy, @d1, @d2) -
CASE WHEN MONTH(@d2) < MONTH(@d1) THEN 1
WHEN MONTH(@d2) > MONTH(@d1) THEN 0
WHEN DAY(@d2) < DAY(@d1) THEN 1
ELSE 0 END
-- = 114 years
Run Code Online (Sandbox Code Playgroud)
比较:
select datediff(day,@d1 ,@d2) / 365.2425
-- = 115 years => wrong!
Run Code Online (Sandbox Code Playgroud)
你也许可以用除法计算小范围,但为什么要冒险呢??
以下脚本可以帮助测试 yeardiff 函数(只需将 cast(datediff(day,@d1,@d2) / 365.2425 as int) 换成任何函数):
declare @d1 datetime set @d1 = '1900-01-01'
while(@d1 < '2016-01-01')
begin
declare @d2 datetime set @d2 = '2016-04-01'
while(@d2 >= '1900-01-01')
begin
if (@d1 <= @d2 and dateadd(YEAR, cast(datediff(day,@d1,@d2) / 365.2425 as int) , @d1) > @d2)
begin
select 'not a year!!', @d1, @d2, cast(datediff(day,@d1,@d2) / 365.2425 as int)
end
set @d2 = dateadd(day,-1,@d2)
end
set @d1 = dateadd(day,1,@d1)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51713 次 |
| 最近记录: |