【问题标题】:prevent rounding off of timestamp in mysql防止在mysql中舍入时间戳
【发布时间】:2014-08-27 01:33:39
【问题描述】:

我有一个带有 TIMESTAMP 类型的单个字段的 MySQL 表。 当我在表中插入时间戳时,它会被四舍五入。

例如 - 如果我做一个

insert into tablename (time) values ("2014-08-25 23:59:59.587");

然后我做一个

select * from tablename;

我明白了

2014-08-26 00:00:00

这导致我的代码中出现错误,我使用最后一条记录的时间戳来确定新一天的开始位置。

如何确保小数部分按原样存储? (或者如果它被正确存储,那么我如何检索它 - (使用 Java))

我正在使用 MySQL 5.6.16 和 Java 8 (虽然问题不需要java,可以从命令行验证)

使用 Java 时,

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;


public class DBTest {

    public static void main(String[] args) {

           try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection dbConn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/demod?useUnicode=true&characterEncoding=utf8", "dawon","1111");
            Statement stmt = dbConn.createStatement();
            String sql = "SELECT TEST FROM TIME;";
            ResultSet rs = stmt.executeQuery(sql);
            rs.next();
            Timestamp ts = rs.getTimestamp("TEST");
            System.out.println("time" + ts.toString() + " " + rs.getTimestamp("TEST"));
            //both print out the rounded off value
           } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

【问题讨论】:

    标签: java mysql timestamp rounding


    【解决方案1】:

    截至MySQL 5.6.4 the support for fractional seconds 包含在TimeDateTimeTimeStamp 数据类型中。

    您的版本应该支持它,您只需要详细说明您的专栏如下:

    要定义包含小数秒部分的列,请使用 语法 type_name(fsp),其中 type_name 是 TIME、DATETIME 或 TIMESTAMP,fsp 是小数秒精度。例如:

    创建表 t1 (t TIME(3), dt DATETIME(6)); fsp 值,如果给定, 必须在 0 到 6 的范围内。值 0 表示没有 小数部分。如果省略,则默认精度为 0。(这与 从标准 SQL 默认值 6 开始,为了与以前的兼容 MySQL 版本。)

    你应该阅读完整的文章,因为它有更多的信息。

    更新

    使用以下命令对我有用:

    /* The fsp value, if given, must be in the range 0 to 6 */
    CREATE TABLE tablename (columnname TIMESTAMP(3));
    

    没什么大不了的,但当前版本的 Workbench 似乎缺少对“创建表”界面中该功能的支持。我必须使用直接命令来创建表。

    【讨论】:

      【解决方案2】:

      [发帖为他人节省时间]

      我在使用 mysql/aurora 时遇到了类似的问题。

      我试图在查询中使用 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createdOn),但发现 SimpleDateFormat 只是删除了其他字段。

      Hibernate 将 Date 字段映射到 MySQL DateTime 列的默认映射(使用注解 @Temporal(TemporalType.TIMESTAMP))对毫秒进行四舍五入。

      为了生成一致的查询,我必须在使用 SimpleDateFormat 时自己实现四舍五入。

      四舍五入代码示例:

      Calendar cal = Calendar.getInstance();
      cal.setTime(this.getCreatedOn());
      if (cal.get(Calendar.MILLISECOND) >= 500 ) {
        System.out.println("Round off milliseconds to seconds");
        cal.set(Calendar.SECOND, cal.get(Calendar.SECOND) + 1);
      }
      

      查询中的用法:

      createdOn = "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(roundedCreatedOn)+ "'"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 2015-07-26
        • 1970-01-01
        • 2016-12-07
        • 2011-12-13
        相关资源
        最近更新 更多