MySQL中Unix时间的一年

MySQL中Unix时间的一年,mysql,Mysql,在MySQL中将一年转换为unix时间时遇到困难 这是我的桌子: CREATE TABLE `person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `born_date` int(45) DEFAULT NULL, `unix_born_date` varchar(100) DEFAULT NULL, `death_date` varchar(45) DEFAULT NULL

在MySQL中将一年转换为unix时间时遇到困难

这是我的桌子:

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `born_date` int(45) DEFAULT NULL,
  `unix_born_date` varchar(100) DEFAULT NULL,
  `death_date` varchar(45) DEFAULT NULL,
  `unix_death_date` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;
在出生日期这一领域,我有很多年,比如«1864»。我想在查询中将它们转换为Unix时间,类似于:

SELECT id, UNIX_TIMESTAMP(STR_TO_DATE(born_date, '%Y')) AS Unixtime
FROM person
但它返回0

有人知道如何将一年转换为Unix时间吗


N.

当您传递日期时,格式需要为YYYY-MM-DD


选择id、UNIX\u时间戳(concat(日期格式(出生日期,'%Y'),'-01-01')

以及其他内容,因为无法处理1864年:

值的有效范围与时间戳数据类型的有效范围相同:
'1970-01-01 00:00:01.000000'
UTC至
'2038-01-19 03:14:07.999999'
UTC

用零填充缺少的数据也无济于事:

未指定的日期或时间部分的值为0,因此str中未完全指定的值将生成部分或全部部分设置为0的结果

+------------+------+---------------------+------------+------------+---------------------+
|d1 | u1 | f1 | d2 | u2 | f2|
+------------+------+---------------------+------------+------------+---------------------+
| 1864-00-00 |    0 | 1970-01-01 01:00:00 | 2017-00-00 | 1480460400 | 2016-11-30 00:00:00 |
+------------+------+---------------------+------------+------------+---------------------+
不管你有什么想法,你都不能用MySQL来实现。

我在这里找到了答案:

而且它有效


N.

UNIX时间戳(出生日期)不起作用吗?
UNIX时间戳(NOW())
起作用,但当我写
UNIX时间戳时(STR\u TO\u date(出生日期,%Y'))
,它返回一个0…出生日期不是有效的日期。如果您有一天/月,那么您就有一个出生日期。目前,您有一个出生年份,而年份本身不足以转换为unix时间戳…您可以将1月1添加为月-年,它应该可以工作。或者将其保留为整数而不是日期。因为您只能使用年。想想看,一年是多少小时分/秒…unix时间戳应该使用哪一个?如果您有周…出生日期,我建议更改为日期时间字段。您的设计中存在严重错误。
born\u date
应该是date而不是int,unix\u born\u date应该是timestamp而不是varchar,death\u date应该是date或datetime not varchar和unix_DEATION_date应该是timestamp。如果您创建了具有适当类型的字段,则不需要像现在这样进行复制。
SELECT id,unix_timestamp(CONCAT(date_格式(born_date,'%Y'),'-01-01'))
返回空值,
SELECT id,unix_timestamp(date格式(CONCAT(born_date,'%01-01'),'%Y-%m'))
返回一个0…抱歉,格式不是我所想的,请尝试UNIX_时间戳(CONCAT(STR_TO_DATE(born_DATE,'%Y'),'-01-01'))
选择id,UNIX_时间戳(DATE_格式(CONCAT(born_DATE,'%01-01'),'%Y-%m-%d')))
工作,但仅适用于1970年之后的日期!它自1970年在W3C开始“Linux遵循Unix设定的以秒为单位计算时间的传统,从它的官方“生日”算起,即1970年1月1日。就是这样!我的表中所有的人都出生在1970年之前!所以我会用PHP来做……我找到了方法!
选择id,DATEDIFF(STR_TO_DATE(CONCAT('1-1-',born_DATE))“%d-%m-%Y”),FROM_UNIXTIME(0))*24*3600出生日期\u unix
SELECT 
STR_TO_DATE(1864, '%Y') AS d1, UNIX_TIMESTAMP(STR_TO_DATE(1864, '%Y')) AS u1,
    FROM_UNIXTIME(UNIX_TIMESTAMP(STR_TO_DATE(1864, '%Y'))) AS f1,
STR_TO_DATE(2017, '%Y') AS d2, UNIX_TIMESTAMP(STR_TO_DATE(2017, '%Y')) AS u2,
    FROM_UNIXTIME(UNIX_TIMESTAMP(STR_TO_DATE(2017, '%Y'))) AS f2;
SELECT id, DATEDIFF(STR_TO_DATE(CONCAT('1-1-',born_date),'%d-%m-%Y'),FROM_UNIXTIME(0))*24*3600 AS born_date_unix