【问题标题】:Converting datetime to/from decimal to preserve milliseconds in MySQL将日期时间转换为/从十进制转换以在 MySQL 中保留毫秒
【发布时间】:2012-05-06 21:05:38
【问题描述】:

MySQL 时间、日期时间和时间戳类型do not preserve milliseconds。但是,MySQL does support storing datetime information using 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);
    }

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

【问题讨论】:

  • MySQL 5.6.4 支持 TIME、TIMESTAMP 和 DATETIME 类型的微秒分辨率。 (见本文末尾bug
  • 可以,但我仍在使用当前普遍可用的版本 5.5.x,它不支持微秒。

标签: mysql datetime timestamp type-conversion precision


【解决方案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]);

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我可以,但我不知道这样会更好。 MySQL支持问题中描述的方法(即,它允许这样的查询工作: select timecol from ttable where timecol > now() )
    【解决方案3】:

    我建议您将数字日期时间表示为 epoch timestamp,表示自 UTC 1970 年 1 月 1 日午夜以来的秒数,而不是像您一样重载以 10 为底的数字表示尝试。

    DateTime 对象转换为纪元时间戳包括从相关对象中减去new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)(以UTC 表示),并将生成的TimeSpan 对象转换为其.TotalSeconds

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

    例如,请参阅this question

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      相关资源
      最近更新 更多