2013-07-20 85 views
0

我遇到了麻烦,无法正确插入TIMESTAMP字段。Java JDBC插入到TIMESTAMP类型中的MySQL失败

方法看起来像这样:

private static void addPickup(Connection conn, boolean debug, String 
     logfileName, String serverName, String mapName, long start, 
     long end) throws SQLException { 

    try (CallableStatement statement = conn.prepareCall("{CALL AddPickup " 
       + "(?, ?, ?, ?, ?) }")) { 
     statement.setString(1, logfileName); 
     statement.setString(2, serverName); 
     statement.setString(3, mapName); 
     statement.setTimestamp(4, new Timestamp(start)); 
     statement.setTimestamp(5, new Timestamp(end)); 
     statement.execute(); 
    } 
} 

开始具有值1373573918000

端具有值1373574819000

步骤:

CREATE PROCEDURE AddPickup(
    IN logfilename VARCHAR(45), 
    IN servername VARCHAR(10), 
    IN mapname VARCHAR(20), 
    IN start TIMESTAMP, 
    IN end TIMESTAMP 
) 
AddPickup:BEGIN 
IF EXISTS(SELECT p.id FROM pickup p WHERE p.logfile_name = logfilename) THEN 
    LEAVE AddPickup; 
END IF; 

INSERT IGNORE INTO map (name) VALUES (mapname); 
INSERT IGNORE INTO server (name) VALUES (servername); 
INSERT INTO pickup (logfile_name, server_id, map_id, started, ended, datetime) 
    VALUES (
     logfilename, 
     (SELECT s.id FROM server s WHERE s.name = servername), 
     (SELECT m.id FROM map m WHERE m.name = mapname), 
     start, 
     end, 
     NOW() 
    ); 
END // 

表:

CREATE TABLE map (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(20) UNIQUE NOT NULL 
) ENGINE = 'InnoDB'; 

CREATE TABLE server (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(10) UNIQUE NOT NULL 
) ENGINE = 'InnoDB'; 

CREATE TABLE pickup (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    logfile_name VARCHAR(45) UNIQUE NOT NULL, 
    server_id INT UNSIGNED NOT NULL, 
    map_id INT UNSIGNED NOT NULL, 
    started TIMESTAMP NOT NULL, 
    ended TIMESTAMP NOT NULL, 
    datetime DATETIME NOT NULL, 
    FOREIGN KEY (map_id) REFERENCES map(id) ON UPDATE CASCADE ON DELETE CASCADE, 
    FOREIGN KEY (server_id) REFERENCES server(id) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE = 'InnoDB'; 

它插入到一切的表,因为它应该只是两个TIMESTAMP领域,pickup.startedpickup.ended总是显示“0000- 00-00 00:00:00“,我不明白为什么。

回答

0

我认为这个问题是在传递给的setTimestamp

参数当我使用的setTimestamp,如果我不得不使用不具体日期,我一直在传递一个新的日期( ).getTime()作为参数。

private static void addPickup(Connection conn, boolean debug, String 
    logfileName, String serverName, String mapName, long start, 
    long end) throws SQLException { 

try (CallableStatement statement = conn.prepareCall("{CALL AddPickup " 
      + "(?, ?, ?, ?, ?) }")) { 
    statement.setString(1, logfileName); 
    statement.setString(2, serverName); 
    statement.setString(3, mapName); 
    statement.setTimestamp(4, new Date().getTime()); 
    statement.setTimestamp(5, new Date().getTime()); 
    statement.execute(); 
} 

}

0

我不是很肯定的东西它是如何工作的MYSQL,但是当我是在SQLSERVER时间戳工作,使用的TIMESTAMP自动生成每当行创建,在那种情况下,我没有提供任何查询时间戳的值。所以只需尝试n插入其他值 希望它也可以帮助你。