2013-06-20 36 views
0

我已经有了一个超过50.000日期的表,我需要将它转换为时间戳字段。根据日期字段更新时间戳列

基本tablelayout:

Fieldname    Type 
+------------------------+-----------+ 
| calendar_date   | DATE  | 
| calendar_unixtimestamp | TIMESTAMP | 
+------------------------+-----------+ 

所以基本上:

update calender set calendar_unixtimestamp = UNIX_TIMESTAMP(calendar_date) 

然而,惯于工作着,当然。所以我试过另一个选项,这个选项在一些愚蠢的网站上告诉我,似乎是合乎逻辑的。但是不能得到它的工作:

update 
    calendar t1 
    join calendar t2 on t2.`calendar_date` = t1.`calendar_date` 
set 
    t1.calendar_unixtimestamp = UNIX_TIMESTAMP(t2.`calendar_date`) 
where 
    t1.`calendar_date` = t2.`calendar_date` 

有人吗?

+0

为什么你说它不起作用?怎么了?是calendar_date日期列或varchar列? – fthiella

+0

当然,对不起。它只是不会更新任何东西。没有发生任何事情我添加了表格结构 –

回答

0

TIMESTAMP数据类型用于包含日期和时间部分的值,而UNIX_TIMESTAMP返回无符号整数。

您应该将calendar_unixtimestamp设置为INT。

请参阅小提琴here

+0

现货!谢谢你的朋友 –

0

本杰明。

我不是MySQL的专家,但我认为你应该阅读:

http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

特别是当它说:

默认情况下,第一个TIMESTAMP列同时如果没有明确指定DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。

的上UPDATE子句使字段值改变为当前的时间戳每当记录被更新,让你更新它,然后它会自动更改为当前时间戳,相同(或几乎)所有记录在你的表中。

也许你需要的是DATETIME列。时间戳列旨在记录何时创建和/或更新。这对于多种用途很有用,包括多个用户尝试更新相同记录时的安全性或冲突解决方案。 a)如果这是你需要的,你应该先禁用ON UPDATE触发器,然后进行更新(你的第一个是OK),然后重新创建触发器(*)。只需添加WHERE条件以确保您不会尝试更新空值。再次,我不确定unix_timestamp是您需要的功能。

 
    UPDATE calendar 
    SET calendar_timestamp = TIMESTAMP(calendar.date) 
    WHERE calendar_date IS NOT NULL 

b)如果不是,您只需将新列的类型更改为DATETIME。 (*)注意:可能会更容易删除列,然后使用DEFAULT子句创建它,但没有ON UPDATE子句或指定NULL子句。

+0

谢谢你的加入队友,但是。重点是,即时通讯运行时间戳输出到一个jFlot脚本,并需要时间戳。我不希望每个选择从blabla有一个选择unix_timestamp(日期)。这就是我想更新所有栏目的原因。时间戳的默认值的确是current_timestamp() –

+0

那么,你应该检查你是否也有ON UPDATE触发器。如果有,则应删除该列,然后使用DEFAULT CURRENT_TIMESTAMP()条件重新创建它,但不要使用ON UPDATE。否则,您将无法更新该字段。对不起,我的帖子中的所有修改。我只是新的stackoverflow :) – Clon