Java 防止mysql中的时间戳舍入
我有一个MySQL表,其中只有一个TIMESTAMP类型的字段。 当我在表中插入一个时间戳时,它被四舍五入 例如,如果我做了一个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; 我明白了 这在我的代码中造成了一个错误,我使用最后一条记录的时间戳来确定新的一天从哪里开始 如何确保分数部分按原样存储? (或者如果它被正确存储,那么我如何检索它?(使用
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);
}