【问题标题】:MySQL date string to date format in new columnsMySQL日期字符串到新列中的日期格式
【发布时间】:2019-08-26 12:42:48
【问题描述】:

表中有一列包含这样的日期:

Thursday, February 28, 2019 (All day) to Friday, March 15, 2019 (All day)

Thursday, February 28, 2019 (All day)

我想将这些日期拆分为 2 个具有日期格式的新字段(我不关心字符串中可能出现的时间部分,而不是“(全天)”)。

所以:Date 是现有字段,From-To 是新字段

+---------------------------------------------------------------------------+------------+------------+
|                                   Date                                    |    From    |     To     |
+---------------------------------------------------------------------------+------------+------------+
| Thursday, February 28, 2019 (All day) to Friday, March 15, 2019 (All day) | 2019-02-28 | 2019-03-15 |
| Thursday, February 28, 2019 (All day)                                     | 2019-02-28 | NULL       |
| Monday, February 11, 2019 - 14:00 to Friday, February 15, 2019 - 14:00    | 2019-02-11 | 2019-02-15 |
+---------------------------------------------------------------------------+------------+------------+

【问题讨论】:

  • 可以在日期字符串旁边显示除“全天”以外的任何内容,如果可以,还有哪些其他值可能?
  • @TimBiegeleisen 这可能是时间,但我不关心这部分,我只关心日期部分。谢谢询问,所以我更新了我的帖子以进行澄清
  • 老实说,您的要求是在扩展 MySQL 真正打算做的事情的极限。您是否有机会将日期信息重新导入为两列,其中包含仅包含日期信息的字符串?
  • @TimBiegeleisen 我从 csv 文件中导入它们。我不知道以某种方式更新 csv 文件然后将其导入我的数据库是否更容易
  • 快速思考:我会寻找字符串 to 并拆分字符串。然后同样寻找-(All day)。而你剩下的就是要转换的日期。

标签: mysql string date


【解决方案1】:

如果您确定这是行的确切格式并且不会有任何意外,您可以使用substring_index()trim() 等字符串函数,最后是str_to_date()

select  
  date Date,
  str_to_date(
    trim(substring_index(date, '(All day)', 1)),
    '%W, %M %d, %Y'
  ) `From`, 
  case when date like '% to %' then                    
    str_to_date(
      trim(replace(replace(substring_index(date, '(All day)', -2), '(All day)', ''), 'to', '')),
    '%W, %M %d, %Y'
  ) else null end `To`                       
from tablename

请参阅demo
结果:

| Date                                                                      | From       | To         |
| ------------------------------------------------------------------------- | ---------- | ---------- |
| Thursday, February 28, 2019 (All day) to Friday, March 15, 2019 (All day) | 2019-02-28 | 2019-03-15 |
| Thursday, February 28, 2019 (All day)                                     | 2019-02-28 |            |

编辑
涵盖行中存在时间的情况:

select
  date,
  str_to_date(
    trim(substring_index(d, '-', 1)),
    '%W, %M %d, %Y'
  ) `From`,
  case when date like '% to %' then
    str_to_date(     
      trim(substring_index(substring_index(d, ' to ', -1), '-', 1)),
      '%W, %M %d, %Y'
    )                     
    else null
  end `To`  
from (
  select 
    date,
    replace(date, '(All day)', '-') d
  from tablename  
) t 

请参阅demo

【讨论】:

  • 好吧,如果您看到我更新的帖子,可能会出现惊喜......因为可能会出现(全天)时间......请查看我的更新帖子,谢谢您对我的帮助
【解决方案2】:

STR_TO_DATE() 函数很可能至少是这里解决方案的一部分。假设每个 from 和 to 列只包含一个日期字符串,我们可以尝试:

SELECT
    STR_TO_DATE('Thursday, February 28, 2019', '%W, %M %d, %Y') AS date_out
FROM dual;

但请注意,这里最好的做法是完全放弃那些文本日期。所以你真的应该做这样的事情:

UPDATE yourTable
SET from_date = STR_TO_DATE(from_date_str, '%W, %M %d, %Y');

然后,删除原始文本日期列。

【讨论】:

  • 请记住,在 Thursday, February 28, 2019 (All day) to Friday, March 15, 2019 (All day) 上使用 STR_TO_DATE(.., , '%W, %M %d, %Y') 可能会产生截断错误/警告,您可能希望在此处包含 LEFT()/SUBSTRING(),因为这对于数据示例更正确..
  • 咖啡时间我确实错过了细节...... “假设每个 from 和 to 列只包含一个日期字符串,我们可以尝试”
  • @RaymondNijland LOL...新加坡啤酒时间到了^ ^
  • 我们荷兰人生活在过去的时区中,我们比新加坡晚 9 小时总是很有趣那些时区..
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 2011-08-27
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多