防止在mysql中舍入时间戳

sar*_*raf 6 java mysql timestamp rounding

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

例如 - 如果我做了

insert into tablename (time) values ("2014-08-25 23:59:59.587");
Run Code Online (Sandbox Code Playgroud)

然后我做了

select * from tablename;
Run Code Online (Sandbox Code Playgroud)

我明白了

2014-08-26 00:00:00
Run Code Online (Sandbox Code Playgroud)

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

如何确保小数部分按原样存储?(或者如果它被正确存储,那么我该如何检索它 - (使用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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Eva*_*tti 7

作为MySQL的5.6.4分数秒支撑被包括在Time,DateTimeTimeStamp数据类型.

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

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

CREATE TABLE 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));
Run Code Online (Sandbox Code Playgroud)

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