【C#】DateTime.Compare 毫秒坑

前陣子做了個項目,需求比照現有的項目處理,結果還發生意想不到的問題。
開發完驗證資料時,發現有一直不斷的塞 DB的現象,但是分明有加上若資料與 DB 的值不一致才要更新。

最後追到是 DateTime.Compare 一直呈現新舊資料不一致的問題…

深入追究後,發現是因為舊的資料是從 MSSQL 抓取,欄位型態是 DateTime(8),資料會長這樣 YYYY-MM-DD hh:mm:ss.fff,但新資料是從 MySQL 抓取,欄位型態是 DateTime ,資料長這樣 YYYY-MM-DD hh:mm:ss

因為有毫秒差的緣故,所以用 DateTime.Compare 一直沒有達到我預期中的結果。

MSSQL

DateTime(4)YYYY-MM-DD hh:mm:ss
DateTime(8)YYYY-MM-DD hh:mm:ss.fff

MySQL

DateTime YYYY-MM-DD hh:mm:ss
DateTime(6)YYYY-MM-DD hh:mm:ss.fff

調整 DB 資料型態為一致當然是最好,但剛好情況不允許,所以沒往這方便進行。
評估之後是做省略毫秒差的方式來比較。

方法一:將毫秒去除

DateTime dateTime1 = dbDateTime1.AddMilliseconds(-dateTime1.Millisecond);
DateTime dateTime2 = dbDateTime2.AddMilliseconds(-dateTime2.Millisecond);

int result = DateTime.Compare(dateTime1, dateTime2);

方法二:將年月日時分秒 new 成新的 DateTime

DateTime dateTime1 = new DateTime(dbDateTime1.Year, dbDateTime1.Month, dbDateTime1.Day, dbDateTime1.Hour, dbDateTime1.Minute, dbDateTime1.Second);
DateTime dateTime2 = new DateTime(dbDateTime2.Year, dbDateTime2.Month, dbDateTime2.Day, dbDateTime2.Hour, dbDateTime2.Minute, dbDateTime2.Second);

int result = DateTime.Compare(dateTime1, dateTime2);

方法三:相減看是否有秒差

TimeSpan timeDifference = dateTime1 - dateTime2;
bool result = timeDifference.TotalSeconds == 0;

參考資料:
https://dev.mysql.com/doc/refman/8.0/en/datetime.html
https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html

分類: C#

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *