将 mediumtext 转换为日期

Convert mediumtext to date

我有以 mediumtext 数据类型存储日期的列数据。如何将 mediumtext 转换为日期以便提取特定时间范围内的数据。

谢谢

示例数据:

我们可以使用具有适当格式模型的 STR_TO_DATE 函数。该函数没有用于将时区缩写作为日期时间字符串的一部分处理的格式模型,因此我们必须进行一些字符串操作来解决它

例如

SELECT STR_TO_DATE( CONCAT(SUBSTRING_INDEX(t.foo,' ',4),' ',SUBSTRING_INDEX(t.foo,' ',-1)),'%a %b %d %T %Y') AS dt
     , SUBSTRING_INDEX(SUBSTRING_INDEX(t.foo,' ',5),' ',-1) AS tz
  FROM ( SELECT 'Fri Sep 11 15:30:55 JST 2015' AS foo
         UNION ALL SELECT 'Fri Sep 11 15:40:09 JST 2015'
         UNION ALL SELECT 'Fri Sep 11 14:55:09 SGT 2015'
         UNION ALL SELECT 'Fri Sep 11 14:57:38 SGT 2015'
         UNION ALL SELECT 'Fri Sep 11 03:59:02 EDT 2015'
         UNION ALL SELECT 'Fri Sep 11 01:10:17 PDT 2015'
       ) t

为了处理时区,我们可以使用CONVERT_TZ函数,但是mysql.time_zone_name(和相关的time_zone tables)需要填充,以处理时区值。

SELECT STR_TO_DATE( CONCAT(SUBSTRING_INDEX(t.foo,' ',4),' ',SUBSTRING_INDEX(t.foo,' ',-1)),'%a %b %d %T %Y') AS dt
     , SUBSTRING_INDEX(SUBSTRING_INDEX(t.foo,' ',5),' ',-1) AS tz

     , CONVERT_TZ( STR_TO_DATE( CONCAT(SUBSTRING_INDEX(t.foo,' ',4),' ',SUBSTRING_INDEX(t.foo,' ',-1)),'%a %b %d %T %Y')
                 , SUBSTRING_INDEX(SUBSTRING_INDEX(t.foo,' ',5),' ',-1)
                 , '+00:00'
       ) AS dt_utc
  FROM ( SELECT 'Fri Sep 11 01:10:17 PDT 2015' AS foo
         UNION ALL SELECT 'Fri Sep 11 01:10:17 PST8PDT 2015'
       ) t

returns

dt                   tz       dt_utc
-------------------  -------  -------------------
2015-09-11 01:10:17  PDT      (NULL)
2015-09-11 01:10:17  PST8PDT  2015-09-11 08:10:17

N.B。如果 mysql.time_zone_name table 不包含 PDTEDTSGT 或我们要转换的其他 tz 值的条目,则 CONVERT_TZ函数将 return NULL。


跟进

在 WHERE 子句中使用这些类型的表达式将需要为 table 中的每一行计算表达式。给定我们要查找的日期值范围,如果信息存储在 DATETIME 列中,并定义了适当的索引,优化器可以使用范围扫描操作。

这使我们得出结论,就性能而言,MEDIUMTEXT 不是存储 DATETIME 值的最佳数据类型。