我有一个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();
}
}
}
答案 0 :(得分:7)
从Time
,DateTime
和TimeStamp
数据类型中包含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;