将 mediumtext 转换为日期
Convert mediumtext to date
我有以 mediumtext 数据类型存储日期的列数据。如何将 mediumtext 转换为日期以便提取特定时间范围内的数据。
谢谢
示例数据:
- 9 月 11 日星期五15:30:55日本标准时间 2015
- 9 月 11 日星期五15:40:09日本标准时间 2015
- 9 月 11 日,星期五 14:55:09 2015 年 SGT
- 9 月 11 日,星期五 14:57:38 2015 年 SGT
- 2015 年 9 月 11 日星期五03:59:02美国东部时间
- 9 月 11 日星期五 01:10:17 PDT 2015
我们可以使用具有适当格式模型的 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 不包含 PDT
、EDT
、SGT
或我们要转换的其他 tz 值的条目,则 CONVERT_TZ
函数将 return NULL。
跟进
在 WHERE 子句中使用这些类型的表达式将需要为 table 中的每一行计算表达式。给定我们要查找的日期值范围,如果信息存储在 DATETIME 列中,并定义了适当的索引,优化器可以使用范围扫描操作。
这使我们得出结论,就性能而言,MEDIUMTEXT 不是存储 DATETIME 值的最佳数据类型。
我有以 mediumtext 数据类型存储日期的列数据。如何将 mediumtext 转换为日期以便提取特定时间范围内的数据。
谢谢
示例数据:
- 9 月 11 日星期五15:30:55日本标准时间 2015
- 9 月 11 日星期五15:40:09日本标准时间 2015
- 9 月 11 日,星期五 14:55:09 2015 年 SGT
- 9 月 11 日,星期五 14:57:38 2015 年 SGT
- 2015 年 9 月 11 日星期五03:59:02美国东部时间
- 9 月 11 日星期五 01:10:17 PDT 2015
我们可以使用具有适当格式模型的 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 不包含 PDT
、EDT
、SGT
或我们要转换的其他 tz 值的条目,则 CONVERT_TZ
函数将 return NULL。
跟进
在 WHERE 子句中使用这些类型的表达式将需要为 table 中的每一行计算表达式。给定我们要查找的日期值范围,如果信息存储在 DATETIME 列中,并定义了适当的索引,优化器可以使用范围扫描操作。
这使我们得出结论,就性能而言,MEDIUMTEXT 不是存储 DATETIME 值的最佳数据类型。