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)
作为MySQL的5.6.4分数秒支撑被包括在Time,DateTime和TimeStamp数据类型.
您的版本应该支持它,您只需要详细说明您的列,如下所示:
要定义包含小数秒部分的列,请使用语法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命令来创建表.