还有一些其他问题,人们遇到时间戳全为零的问题。我检查了它们,这不是重复的。
我宣布一个这样的表:
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应该如何格式化日期吗?
答案 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)。