2012年7月3日 星期二

[狗大便] 不容易被發現哪裡出問題的問題 (1) - DateTime

去你媽的這篇文居然在電腦跑很慢的時候被吃掉了,害我又得再重po一次,幹你媽的!

--幹你媽的分隔線--

問題背景:
以下是source code。
這段method的主要動作,是檢查兩個實體物件的內容是否完全相同。
像這種左右對稱的寫法,看起來好像沒什麼問題,常理來說應該可以達到我預期的目的。

但是實際在運作的時候,就是會有時候和預期中的運作結果不一樣。有時候可以很正常,有時候就會錯,搞得全等都不全等了。
那麼,到底是哪裡出了問題?















--解答在此--

資料型態的轉換,中間會有一個讓人頭疼的風險:資料的失真,尤其是失真的過程還讓人不知不覺的時候。

那像這種資料,在什麼情況下會失真?

實驗的結果為:把從C#程式裡取得的DateTime寫入SQL Server的DateTime的過程
DateTime是一種用來表示日期和時間的類別,在寫應用程式的時候十分的泛用。但是各家的定義為何,就不太一定了。

大方向上當然是不會有什麼問題,問題是出在Ticks這種微小精細的東西上。.NET的Ticks定義為從0001-01-01 00:00開始的計算100奈秒的差距量;而SQL Server的Ticks則是1970-01-01 00:00開始。定義上有差,跑出來的數字當然就不一樣。

想當然爾,如果把一個從.NET取得的DateTime存進SQL Server,再原封不動地拿出來和原本的值做全等比較(==),自然就會有讓人感受不出來的差異。 

所以,我把程式稍做修改,世界就和平了~

ref:
[1] http://hi.baidu.com/raybook/blog/item/6702d32a98ce88315343c18b.html
[2] http://seesharper.wordpress.com/2008/07/08/sql-server-datetime-vs-net-datetime-battle-of-accuracy/

沒有留言: