防止在mysql中舍入时间戳

时间:2014-08-27 01:33:40

标签: java mysql timestamp rounding

我有一个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();
        }
    }
}

2 个答案:

答案 0 :(得分:7)

TimeDateTimeTimeStamp数据类型中包含MySQL 5.6.4 the support for fractional seconds

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

  

要定义包含小数秒部分的列,请使用   语法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似乎缺少“create table”界面中对该功能的支持。我不得不使用direct命令来创建表。

答案 1 :(得分:0)

[为他人节省时间]

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

我试图在查询中使用新的SimpleDateFormat(&#34; yyyy-MM-dd HH:mm:ss&#34;)。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 =&#34;&#39;&#34; + new SimpleDateFormat(&#34; yyyy-MM-dd HH:mm:ss&#34;)。format(roundedCreatedOn)+&#34;&#39;&#34;