问题在MySQL中插入时间戳值

时间:2010-06-19 04:58:18

标签: mysql ado

还有一些其他问题,人们遇到时间戳全为零的问题。我检查了它们,这不是重复的。

我宣布一个这样的表:

CREATE TABLE  `my_db`.`my_table` (
  `time_stamp` timestamp NOT NULL,
  `author` varchar() NOT NULL,
  `text` text NOT NULL,
  `md5` int(11) NOT NULL,
  PRIMARY KEY (`time_stamp`)
) ;

我还有一个第二个表,它将时间戳作为主键,它们应该具有相同的值。

在Delphi中编码,我使用SELECT CURRENT_TIMESTAMP返回类似'19/6/2010 4:56:17 AM'的东西,然后我在INSERT语句中使用它。 INSERT成功,但时间戳全为零。

我做错了什么?

这是INSERT代码:

  sqlCommand := 'INSERT INTO my_db.my_table(time_stamp, author, text, md5) VALUES ("' 
                   + timestamp + 
                    '", "mawg", ' +
                    '"Hello, world"' +
                    0 +
                    '");';
  Result := DoSQlCommandWithNoResultSet(sqlCommand, AdoConnection);

插入将是极低的费率,每隔几周或几个月一次,所以我很满意时间戳作为主键。我保留了“版本”的东西,所以时间戳对我来说很有意义。

我乞求认为这是一个ADO问题,尽管我希望ADO能够“通过”。我没有看到任何其他解决方案。在控制台中,输出是“正确的”,但是当在Delphi中通过ADO运行时则是错误的

我可以指定MySQL应该如何格式化日期吗?

3 个答案:

答案 0 :(得分:2)

看看MySQL date functions。它们非常广泛,具有很高的灵活性。

除此之外,我建议重新考虑你的表格结构。时间戳作为主键并不完全是您想要的。当您拥有高流量时,可能会发生时间戳相同的情况。此外,如果要连续保存2个或更多记录,则时间戳将相同。此外,MD5列设置为int(11)。 MD5哈希使用混合字符,所以我宁愿选择varchar(32)。

CREATE TABLE  `my_db`.`my_table` ( 
  `id` int(11) NOT NULL,
  `timestamp` timestamp NOT NULL,
  `author` varchar(100) NOT NULL,
  `text` text NOT NULL,
  `md5` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ;

答案 1 :(得分:2)

在查看MySQL文档后,如果您的timestamp值格式不正确,通常会导致时间戳为'0000-00-00 00:00:00'。 在任何情况下,您都不需要指定时间戳值 - 这是TIMESTAMP优于DATETIME的好处。即使您这样做,也可以将其设置为NOW(),而不是运行不必要的SELECT语句。

编辑:

另外,我知道你说你想过这个,但你有没有考虑过夏令时?这可能会导致两个记录在秋季时钟设置时具有相同的时间戳。

编辑2:

K,我不知道为什么我之前没有抓到这个,但你提供的时间戳格式不正确。尝试插入有效的时间戳,例如'2010/06/19 4:56:17'。 MySQL对日期和时间的解析非常轻松时间值,但它必须始终为年 - 月 - 日和时 - 分 - 秒。

编辑3:

好吧,这似乎有点混乱,所以我要在DATETIME format上的MySQL 5.0 doc页面上发布这句话:

  

对于指定为包含日期部分分隔符的字符串的值,没有必要为月份或日期值小于10指定两位数。'1979-6-9'与'1979-06-09相同”。类似地,对于指定为包含时间部分分隔符的字符串的值,没有必要为小于10的小时,分​​钟或秒值指定两个数字。'1979-10-30 1:2:3'是相同的如'1979-10-30 01:02:03'。

答案 2 :(得分:1)

AFAIR 19/6/2010 4:56:17 AM不是MySQL日期类型的有效日期格式。您应该将其转换为2010-06-19 04:56:14(请参阅doc)。