我在正确插入TIMESTAMP字段时遇到问题。
方法如下所示:
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();
}
}
start的值为1373573918000
end的值为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.started和pickup.end始终显示"0000-00-00 00:00:00",我不知道为什么。
我认为问题出在您传递给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();
}
}
我不太确定它在MYSQL中是如何工作的,但当我在SQLSERVER中处理时间戳时,timestamp用于在创建行时自动生成,在这种情况下,我没有从查询中提供任何时间戳值。所以试着插入其他值希望它也能帮助你。