Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止mysql中的时间戳舍入_Java_Mysql_Timestamp_Rounding - Fatal编程技术网

Java 防止mysql中的时间戳舍入

Java 防止mysql中的时间戳舍入,java,mysql,timestamp,rounding,Java,Mysql,Timestamp,Rounding,我有一个MySQL表,其中只有一个TIMESTAMP类型的字段。 当我在表中插入一个时间戳时,它被四舍五入 例如,如果我做了一个 insert into tablename (time) values ("2014-08-25 23:59:59.587"); 然后我做了一个 select * from tablename; 我明白了 这在我的代码中造成了一个错误,我使用最后一条记录的时间戳来确定新的一天从哪里开始 如何确保分数部分按原样存储? (或者如果它被正确存储,那么我如何检索它?(使用

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

例如,如果我做了一个

insert into tablename (time) values ("2014-08-25 23:59:59.587");
然后我做了一个

select * from tablename;
我明白了

这在我的代码中造成了一个错误,我使用最后一条记录的时间戳来确定新的一天从哪里开始

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

我正在使用MySQL 5.6.16和Java8 (尽管该问题不需要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();
        }
    }
}
截至包含在
时间
日期时间
时间戳
数据类型中

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

要定义包含小数秒部分的列,请使用 语法类型_name(fsp),其中类型_name是时间、日期时间或 时间戳,fsp是小数秒精度。例如:

创建表t1(t时间(3),dt日期时间(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));

这没什么大不了的,但当前版本的工作台似乎缺少对“createtable”界面中该特性的支持。我不得不使用direct命令来创建表。

[为他人节省时间而发布]

我在mysql/aurora中遇到了类似的问题

我试图在查询中使用新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss”).format(createdOn),但发现SimpleDataFormat只会删除额外的字段

Hibernate默认的日期字段到MySQL日期时间列的映射(使用注释@Temporal(TemporalType.TIMESTAMP))是以毫秒为单位的

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

四舍五入代码示例:

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=“”+新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss”)。格式(roundedCreatedOn)+“

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