根据日期字段更新时间戳列

时间:2013-06-20 10:39:22

标签: mysql sql

我有一个超过50,000个日期的表,我需要将其转换为Timestamp字段。

基本表格布局:

  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`

任何?

2 个答案:

答案 0 :(得分:0)

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

您应该将calendar_unixtimestamp设置为INT。

请参阅小提琴here

答案 1 :(得分:0)

本杰明。

我不是mysql的专家,但我认为你应该读这个:

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

特别是当它说:

  

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

on 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子句。