Преобразовать средний текст в дату - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть данные столбца, которые хранят дату в типе данных типа texttext. Как преобразовать средний текст в дату, чтобы можно было извлечь данные за определенный промежуток времени.

Спасибо

Пример данных:

  • Пт 11 сентября 15:30: 55 JST 2015
  • пт 11 сентября 15:40:09 JST 2015
  • пт 11 сентября 14:55:09 SGT 2015
  • пт 11 сентября 14:57:38 SGT 2015
  • пт 11 сентября 03:59:02 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2015
  • пт 11 сентября 01:10:17 PDT 2015

1 Ответ

2 голосов
/ 25 февраля 2020

Мы можем использовать функцию STR_TO_DATE с подходящей моделью формата. Функция не имеет форматной модели для обработки аббревиатуры часового пояса как части строки datetime, поэтому нам нужно немного поработать со строкой, чтобы обойти ее

например

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).

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

возвращает

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

NB Если в таблице mysql.time_zone_name нет записей для PDT, EDT, SGT или других значений tz, которые мы хотим преобразовать, функция CONVERT_TZ вернет NULL.


FOLLOWUP

Использование этих типов выражений в предложении WHERE потребует вычисления выражения для каждой строки в таблице. При заданном диапазоне значений дат, которые мы ищем, если информация была сохранена в столбце DATETIME с соответствующим индексом, оптимизатор мог бы использовать операцию сканирования диапазона.

, что приводит нас к выводу что для производительности MEDIUMTEXT - не лучший тип данных для хранения значений DATETIME.

...