在 MySQL 的新列中将纪元转换为星期几
Converting Epoch to day of the week in new column in MySQL
我有一个 table,其中有一列包含 unix 时间。我希望创建一个包含这次星期几的新列。例如,1436160600 将是此列中的星期一。
我创建了一个新专栏,标题为 "day_of_week"
alter table master add column test varchar(20);
我现在希望用适当的值更新这个新列。
我找到了 MySQL Unixtimestamp() 函数 (http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp)
然后我尝试了以下
update master set day_of_week = _sent_time_stamp(from_unixtime(unix_timestamp, %W));
其中 _sent_time_stamp 是包含 Unix 时间值的列
但这会导致错误 1064。
有人可以指点一下吗?
解决方案。将纪元转换为日期时间
alter table master add column test_date datetime ;
update master set test_date = from_unixtime(_sent_time_stamp) ;
使用 dayname 函数将日期时间转换为星期几
alter table master add column test_day varchar(20) ;
update master set test_day = dayname(test_date) ;
我知道这个 post 是旧的,但是接受的答案很浪费,我希望未来寻求这个答案的人能够更加开明。
无需为某些临时值向 table 添加新列。要实现您的要求,您只需这样做:
UPDATE master
SET test_day = dayname(from_unixtime(_sent_time_stamp)) ;
然而,即使是目标也是一种浪费,因为我们只是存储相同数据的两种表示形式。您可以做的是创建一个视图:
CREATE VIEW master_vw AS
(SELECT mstr.*, DAYNAME(FROM_UNIXTIME(mstr._sent_time_stamp)) AS test_day
FROM master mstr) ;
现在,您可以随时从该视图中 SELECT,test_day 的值将始终与 _sent_time_stamp 的值同步。并且没有新的专栏需要维护等等。
有一个实际存储 test_day 列的用例 - 与从 table 中选择相比,视图的执行将需要少量的额外处理。而且您不能像在 table 中那样在虚拟 test_day 列上建立索引。因此,如果您有数百万行并且需要快速获得(例如)'Saturday' 行,那么 table 方法可能更理想。
但如果列只是为了方便,或者它只是对现有数据的不同表示,那么您最好考虑使用视图方法。
我有一个 table,其中有一列包含 unix 时间。我希望创建一个包含这次星期几的新列。例如,1436160600 将是此列中的星期一。
我创建了一个新专栏,标题为 "day_of_week"
alter table master add column test varchar(20);
我现在希望用适当的值更新这个新列。
我找到了 MySQL Unixtimestamp() 函数 (http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp)
然后我尝试了以下
update master set day_of_week = _sent_time_stamp(from_unixtime(unix_timestamp, %W));
其中 _sent_time_stamp 是包含 Unix 时间值的列
但这会导致错误 1064。
有人可以指点一下吗?
解决方案。将纪元转换为日期时间
alter table master add column test_date datetime ;
update master set test_date = from_unixtime(_sent_time_stamp) ;
使用 dayname 函数将日期时间转换为星期几
alter table master add column test_day varchar(20) ;
update master set test_day = dayname(test_date) ;
我知道这个 post 是旧的,但是接受的答案很浪费,我希望未来寻求这个答案的人能够更加开明。
无需为某些临时值向 table 添加新列。要实现您的要求,您只需这样做:
UPDATE master
SET test_day = dayname(from_unixtime(_sent_time_stamp)) ;
然而,即使是目标也是一种浪费,因为我们只是存储相同数据的两种表示形式。您可以做的是创建一个视图:
CREATE VIEW master_vw AS
(SELECT mstr.*, DAYNAME(FROM_UNIXTIME(mstr._sent_time_stamp)) AS test_day
FROM master mstr) ;
现在,您可以随时从该视图中 SELECT,test_day 的值将始终与 _sent_time_stamp 的值同步。并且没有新的专栏需要维护等等。
有一个实际存储 test_day 列的用例 - 与从 table 中选择相比,视图的执行将需要少量的额外处理。而且您不能像在 table 中那样在虚拟 test_day 列上建立索引。因此,如果您有数百万行并且需要快速获得(例如)'Saturday' 行,那么 table 方法可能更理想。
但如果列只是为了方便,或者它只是对现有数据的不同表示,那么您最好考虑使用视图方法。