MySQL日期字符串以新列中的日期格式

时间:2019-08-26 12:42:48

标签: mysql string date

表中有一个包含如下日期的列:

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

OR

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 |
+---------------------------------------------------------------------------+------------+------------+

2 个答案:

答案 0 :(得分:1)

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');

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

答案 1 :(得分:1)

如果您确定这是行的确切格式,并且不会感到意外,则可以使用substring_index()trim()以及最后的str_to_date()这样的字符串函数来做到这一点:< / p>

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

相关问题