我自動接收到數據爲ETL
的報告。我提取並轉換某些數據以將其加載到其他地方。有一兩件事,我需要做的是一個DATEDIFF
但今年必須準確(即,4.6年,而不是四捨五入長達五年使用SQL計算確切的日期差異使用SQL
以下是我的腳本:
select *, DATEDIFF (yy, Begin_date, GETDATE()) AS 'Age in Years'
from Report_Stage;
的'Age_In_Years'
列是圓的。我如何在幾年的確切日期?
我自動接收到數據爲ETL
的報告。我提取並轉換某些數據以將其加載到其他地方。有一兩件事,我需要做的是一個DATEDIFF
但今年必須準確(即,4.6年,而不是四捨五入長達五年使用SQL計算確切的日期差異使用SQL
以下是我的腳本:
select *, DATEDIFF (yy, Begin_date, GETDATE()) AS 'Age in Years'
from Report_Stage;
的'Age_In_Years'
列是圓的。我如何在幾年的確切日期?
您是否嘗試過讓幾個月的差異,而不是,然後計算這些年來呀?舉例講,30月/ 12將是5年。
艾迪T:這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
該列仍在四捨五入 –
@JeffOrris - ...它是如此回答你的問題嗎?你的接受意味着一件事,但你的意見是另一回事。這可能是因爲數學只作爲整數執行的(也就是說,它應該是'/ 12.0'來強制浮點數學,就像在你的問題上的評論一樣)。 @Fumbles - 你需要將相關代碼添加到這樣的答案中,否則應該關閉。 –
在原始答案中增加了代碼示例。 – FumblesWithCode
所有datediff()
確實是要計算日期之間的交叉週期邊界的數量。例如
datediff(yy,'31 Dec 2013','1 Jan 2014')
返回1
,如果你在400計算在天兩個日期,再除以歷年的平均長度之間的差別你會得到更準確的結果年的跨度(365.2425):
datediff(day,{start-date},{end-date},)/365.2425
例如,
select datediff(day,'1 Jan 2000' ,'18 April 2014')/365.2425
換貨政... 14.29461248
—只是圍繞它達到所需的精度。
我認爲除以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
對於比較:
select datediff(day,@d1 ,@d2)/365.2425
-- = 115 years => wrong!
你也許能夠計算出很小的範圍內與師,但爲什麼抓住機會?
下面的腳本可以幫助測試yeardiff功能(只要將投(DATEDIFF(日,@ D1,@ D2)/ 365.2425如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
如果你只需要一個有效數字,嘗試DATEDIFF(dd ..併除以365.這不會成爲閏年的因素,但 –
只會使其偏離正確的數值,1 + - 1正確? –
這樣 –