2016-09-27 82 views
0

我有一個應該代表未來季度的SQL Server FLOAT列:驗證十進制值是YYYY.Q格式

DELIVERY_DATE(浮動,NULL)

雖然這不是一個理想的格式對於日期表示形式,我在Excel工作簿中接收數據並使用SSIS包將其加載到SQL Server中。它來自外部供應商,所以它就是這樣。

值必須採用YYYY.Q格式。年度季度需要在未來,所以,如果我們在2016年第三季度,2016.3的值是不正確的。只有一年,沒有四分之一的值也是不正確的。

制定此檢查的最佳方法是什麼?

+0

我希望這不是家庭作業,否則你的教授將是一個非常殘酷的怪物。爲什麼不把Q3 2016存儲爲2016/07/01? – ajeh

回答

2

A float表達這種數據是真的,真的,真的,真的很糟糕的方式,因爲float是十進制數的近似表示。如果您對結構有任何控制權,您應將其更改爲decimal(5, 1)或其他某種類型。

可以使用得到當前季度以這種形式:

select year(getdate()) + datepart(quarter, getdate())/10.0 

的問題是,小圓角的差異可能意味着預期下不起作用:

where Delivery_Date <= year(getdate()) + datepart(quarter, getdate())/10.0 

交貨日期可能是2016.30000000001,第二部分可能會返回2016.299999997。他們都看起來像「2016.3」,但他們不相等。

我想你可以加少許增量,使其工作:

where Delivery_Date <= 0.01 + year(getdate()) + datepart(quarter, getdate())/10.0 

但使用不當float是危險的。

+0

我同意小數點比浮點數要好,但最好還是爲查詢性能設置單獨的列。我討厭在我的查詢中解析數據=/ – ps2goat

+0

不幸的是,我無法控制列的類型。 – Buggieboy

+0

您的2016.3可能會以2016.299999999存儲在「浮動」列中。那麼你打算怎麼做? – ajeh