java – 防止在mysql中舍入时间戳

我有一个MySQL表,其中包含TIMESTAMP类型的单个字段.当我在表中插入一个时间戳时,它会四舍五入.例如 – 如果我做了insert into tablename (time) values (2014-08-25 23:59:59.587);然后我做了select * from table...

我有一个MySQL表,其中包含TIMESTAMP类型的单个字段.
当我在表中插入一个时间戳时,它会四舍五入.

例如 – 如果我做了

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

解决方法:

截至MySQL 5.6.4 the support for fractional seconds包含在Time,DateTime和TimeStamp数据类型中.

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

To define a column that includes a fractional seconds part, use the
syntax type_name(fsp), where type_name is TIME, DATETIME, or
TIMESTAMP, and fsp is the fractional seconds precision. For example:

CREATE TABLE t1 (t TIME(3), dt DATETIME(6)); The fsp value, if given,
must be in the range 0 to 6. A value of 0 signifies that there is no
fractional part. If omitted, the default precision is 0. (This differs
from the standard SQL default of 6, for compatibility with previous
MySQL versions.)

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

更新

它使用以下命令在我这里工作:

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

没什么大不了的,但是当前版本的Workbench似乎缺少“create table”界面中对该功能的支持.我不得不使用direct命令来创建表.

本文标题为:java – 防止在mysql中舍入时间戳

基础教程推荐