2012-05-06 33 views
1

MySQL時間,日期時間和時間戳類型do not preserve milliseconds。但是,MySQL does support storing datetime information using decimal(17,3)。我想出了以下c#代碼來在(.net)datetime和decimal之間來回轉換。將日期時間轉換爲十進制數以保留MySQL中的毫秒數

public static decimal ToDecimalForMySql(System.DateTime dateTime) 
    { 
     return dateTime.Year * 10000000000m + dateTime.Month * 100000000m + dateTime.Day * 1000000m + dateTime.Hour * 10000m + dateTime.Minute * 100m + dateTime.Second + dateTime.Millisecond * 0.001m; 
    } 

    public static System.DateTime FromDecimalForMySql(decimal dateTime) 
    {    
     long truncated = (long) Math.Truncate(dateTime); 
     int msecs = (int) (1000 * (dateTime - truncated)); 
     long month; 
     int day, hour, minute, second; 
     return new System.DateTime((int) Math.DivRem(truncated, 10000000000, out month), Math.DivRem((int) month, 100000000, out day), 
      Math.DivRem(day, 1000000, out hour), Math.DivRem(hour, 10000, out minute), Math.DivRem(minute, 100, out second), second, msecs); 
    } 

是否有更有效的方式來做到這一點,也許使用位字段從十進制轉換回datetime?

+0

MySQL 5.6.4支持TIME,TIMESTAMP和DATETIME類型的微秒分辨率。 (見[bug](http://bugs.mysql.com/bug.php?id=8523)) – pilcrow

+0

它的確如此,但我仍然使用當前通用的版本5.5.x,它可以不支持微秒。 – Jimmy

回答

0

難道你不能把日期時間和存儲每個元素,DA,Y小時,分鐘,秒,毫秒在你的表中的單獨的單元格在MySQL中。然後,您需要一個函數,在發送它之前分解您的日期/時間,並在檢索時重新格式化函數。

+0

我可以,但我不明白那會更好。問題中所描述的問題是由MySQL支持的(即,它允許像這樣的查詢工作:從ttable中選擇timecol> now()) – Jimmy

0

我可以建議你,而不是由代表你的數字日期時間爲epoch timestamp代表自午夜1970年1月1日UTC秒數超載了一些的基地10表示你正在嘗試。一個DateTime對象的

轉換到一個劃時代時間戳涉及從對象所討論減去new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)(如UTC),並將所得TimeSpan對象轉換爲它的.TotalSeconds

反過來,通過AddSeconds將代表時間戳(再次,自1970-01-01 00:00:00'以來的小數秒)添加到代表曆元的DateTime對象。例如,參見this question

好處:這種方法適用於MySQL函數FROM_UNIXTIME()。它也將被UNIXY的同事視爲一個橄欖枝,他們會立即將分數字段識別爲日期時間度量。

1

我使用了以下內容:

public static string ToDecimalForMySql(System.DateTime dateTime) 
{ 
    return dateTime.toString("yyyyMMddHHmmss.fff"); 
} 

注意上面的函數返回類型爲字符串,不是小數。這可以直接在你的SQL查詢字符串中使用。

要檢索出來的MySQL的,我發現它最有效的使用方法:

在C#
SELECT CONCAT('',DecimalDateTimeField) FROM table [where clause etc] 

然後,假設你使用了MySqlDataReader(變量名 「RS」):

DateTime dt = DateTime.Parse((string)rs[0]);