0

我有一个包含超过 50.000 个日期的表格,我需要将其转换为时间戳字段。

基本表格布局:

  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`
  

任何人?

4

2 回答 2

0

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

你应该设置calendar_unixtimestamp为 INT。

在此处查看小提琴。

于 2013-06-20T10:46:21.123 回答
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 触发器,然后进行更新(您的第一个是好的),然后重新创建触发器(*)。只需添加一个 WHERE 条件以确保您不会尝试更新空值。同样,我不确定 unix_timestamp 是您需要的功能。

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

b) 如果不是,您只需将新列的类型更改为 DATETIME。

(*)注意:可能删除列会更容易,然后使用 DEFAULT 子句创建它,但不使用 ON UPDATE 子句,或者指定 NULL 子句。

于 2013-06-20T12:15:20.740 回答