2014-04-10 51 views
0

我有一个包含三列的表,birth_day,birth_month和birth_year。这三个都是INT。我想CONCAT()这些并将它们转换为EPOCH并将它们保存回新列。传递给EPOCH的字符串MySQL

要CONCAT()这些值我用

SELECT CONCAT(birth_month, "/", birth_day, "/", birth_year) AS new_birthday from birthdaytable 

我被陷在我将如何转换为EPOCH。我会尝试将new_birthday投到一天,然后对此进行一些计算,但其中一些年份不在MySQL的DATE/YEAR范围内(有些在1901年之前)

想法?

+1

你为什么不使用一个简单的日期列? “支持的范围是'1000-01-01'到'9999-12-31'”,参见http://dev.mysql.com/doc/refman/5.5/en/datetime.html – VMai

+0

1901是极限的32位UNIX'time_t'类型纪元值。你为什么使用这些,尤其是日期?这里的时区非常重要,并且会大幅摆动这个值的解释。 – tadman

回答

1

你必须改变你的CONCAT第一,并结合起来,与UNIX_TIMESTAMP

SELECT UNIX_TIMESTAMP(CONCAT(birth_year, "-", IF(birth_month < 10, CONCAT('0', birth_month), birth_month), "-", IF(birth_day < 10, CONCAT('0', birth_day), birth_day))) AS newField from birthdaytable 
+0

已更新,以满足您使用零填充的需要 –

+0

谢谢,大多数情况下都适用,但某些UNIX_TIMESTAMP()仍然返回为0。如果我删除UNIX_TIMESTAMP()只是为了查看concat,它看起来像日期格式正确,我不能告诉任何押韵或他们无法工作的原因。例如“1981-12-27”可以很好地转换,而“1934-02-05”返回0.00 – user2229544

+0

@ user2229544,这是因为unix时间戳从'1970-01-01'开始。如果您在此之前处理日期,则不能使用unix时间戳。正如上面的评论中所提到的那样,对于新列,最好使用'DATE'数据类型。 –

0

用途:

mysql> SELECT UNIX_TIMESTAMP('2007-11-30 10:30:19');-> 1196440219 

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

+0

谢谢!它看起来像这样会工作,但我没有注意到,直到我用你的查询。这些月份是单数或双数。因此,10,11和12可以很好地转换,任何单个数字月份都不会,它们是检查单个数字月份的简单方法吗?如果是这样,请添加前导0? – user2229544

+0

使用DATE_FORMAT() –