【问题标题】:How to fetch DateTime from mysql using xdevapi如何使用 xdevapi 从 mysql 获取 DateTime
【发布时间】:2018-09-02 13:49:14
【问题描述】:

当我选择一个 dateTime 字段时,它会以 6 个字节的形式返回。如何将其转换为 time_point 或 struct tm?

mysqlx::Session session( "mysqlx://root:password@127.0.0.1:33060/catalog" );
auto row = session.sql( "select create_time from information_schema.tables order by 1 LIMIT 1" ).execute().fetchOne();
assert( row[0].getType()==8 );//raw type
assert( row[0].getRawBytes().second==6 );//6 bytes
var bytes = row[0].getRawBytes().first;
//e2 0f 08 0c 0a 32 
//2018-08-12 10:50:04

【问题讨论】:

    标签: c++ mysql mysql-connector


    【解决方案1】:

    嘿,我只是花了 5 个小时来弄清楚同样的事情,解决方案是将 TIME/DATE/DATETIME 字段投影为 UNIX 时间戳(整数)使用 UNIX_TIMESTAMP() 的 SQL 语句。

    然后您可以轻松地将字段设为time_t(并可选择转换为struct tm)。

    #include<time.h>
    
    mysqlx::Session session{"mysqlx://root:password@127.0.0.1:33060/catalog"};
    auto row = session.sql("SELECT UNIX_TIMESTAMP(create_time) FROM information_schema.tables ORDER BY 1 LIMIT 1").execute().fetchOne();
    time_t creationTime = (int) row[0];
    struct tm* creationTimePoint = localtime(creationTime);
    

    希望这会有所帮助。 -介意

    【讨论】:

    • 我在隐式转换Conversion from 'mysqlx::Value' to 'time_t' (aka 'long') is ambiguous 并使用UNIX_TIMESTAMP 时遇到此错误,它表示该值无法转换为整数。
    • @SagunKho 我在我的答案中添加了一个明确的演员,你仍然遇到问题吗?如果UNIX_TIMESTAMP 说它不能将该字段转换为整数,则它可能不是时间相关字段。
    • 问题是该列可以为空并且值为空。它无法转换为任何东西,所以我不得不使用row[0].getType() &gt; 0 检查类型。不过感谢您的回答。
    • 谢谢,最初我转换为字符串,但 UNIX_TIMESTAMP 更好。由于日期是 UTC,我使用 UNIX_TIMESTAMP(CONVERT_TZ(create_time, '+00:00', 'SYSTEM'))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    相关资源
    最近更新 更多