2014-05-14 52 views
0

DateDiff = 23因此23/30爲0.77。SQL Server舍入

我不能讓@Tenor爲1,這是0.77四捨五入...它不斷給我0 ...

DECLARE @Tenor Decimal(18,6) 
SET  @Tenor = ROUND(DATEDIFF(D,'2014-04-14','2014-05-07')/30, 0) 

它的工作原理,如果我這樣做......這會給我1。但是我需要使用上面的方法,因爲它全部在UPDATE語句中。提示表示讚賞,謝謝。

DECLARE @Tenor Decimal(18,6) 
DECLARE @dd decimal(18, 6) 
SELECT @dd = DATEDIFF(D, '2014-04-14', '2014-05-07') 
SET @Tenor = Round(@dd/30,0) 

回答

2

使用30.0在你的部門,迫使非整數運算

DECLARE @Tenor Decimal(18,6) 
SET  @Tenor = ROUND(DATEDIFF(D,'2014-04-14','2014-05-07')/30.0, 0) 
SELECT @Tenor -- 1.000000 

您所看到的行爲是在SQL Server隱式類型轉換的結果。 DATEDIFF(D,'2014-04-14','2014-05-07')30的返回類型都是int,所以在將二者分開(有效地移除結果的小數部分,即0)時將發生整數除法。

在你的第二次嘗試股利(@dd)被定義爲decimal導致除數(30)到decimal的隱式轉換,給你所期望的結果。

+0

謝謝。這很令人沮喪,並不會認爲30.0會解決它。 – nanonerd

1
SELECT @Tenor = ROUND((CAST(DATEDIFF(D,'2014-04-14','2014-05-07') AS DECIMAL(18,6))/30), 0) 

這應該將它舍入到1

+0

弗蘭克,謝謝。我用@ Pero的解決方案,但這是有道理的...... – nanonerd

+0

實際上,再看一遍,我不想使用天花板...但對十進制部分的投射可能工作(無天花板)。 – nanonerd

+0

是的,你是正確的,它沒有CEILING工作。我更新了我的答案。 – Frank