1

MySQL 时间、日期时间和时间戳类型不保留毫秒。但是,MySQL 确实支持使用 decimal(17,3) 存储日期时间信息。我想出了以下 c# 代码在 (.net) 日期时间和十进制之间来回转换。

    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);
    }

有没有更有效的方法来做到这一点,也许使用位字段从十进制转换回日期时间?

4

3 回答 3

1

我正在使用以下内容:

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

注意上面的函数返回类型是字符串,而不是十进制。这可以直接在您的 SQL 查询字符串中使用。

要从 MySQL 中检索,我发现使用它最有效:

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

然后在 C# 中,假设您使用的是 MySQLDataReader(变量名“rs”):

DateTime dt = DateTime.Parse((string)rs[0]);
于 2012-08-08T08:25:16.973 回答
0

你能不能把日期时间和每个元素存储在 mysql. 然后,您需要一个在发送日期/时间之前分解日期/时间的函数,以及在检索时重新格式化它的函数。

于 2012-05-07T16:59:01.733 回答
0

我可以建议您将您的数字日期时间表示为一个纪元时间戳,表示自 1970 年 1 月 1 日午夜 UTC 以来的秒数,而不是在您尝试时重载数字的基数 10 表示。

将对象转换为DateTime纪元时间戳涉及new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)从相关对象中减去(作为 UTC),并将结果TimeSpan对象转换为其.TotalSeconds.

相反,一个纪元时间戳(同样,自 '1970-01-01 00:00:00' 以来的小数秒)被添加到DateTime表示纪元的对象中AddSeconds

例如,参见这个问题

好处:这种方法可以很好地与 MySQL 函数 FROM_UNIXTIME() 配合使用。它也将被您的 UNIXy 同事视为橄榄枝,他们会立即将分数字段识别为日期时间度量。

于 2012-05-07T19:29:12.490 回答