Преобразовать дневное время в строку в datetime в sqllite 3? - PullRequest
0 голосов
/ 22 ноября 2018

Я храню значение даты и времени в SqlLite3 в столбце TEXT.данные хранятся как 2018 Nov 16 15:53:01.Как мне преобразовать его обратно в дату и время?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Это сделает обновление, просто заменив часть месяца MMM двузначным числом.
Последний оператор CASE проверяет, является ли номер дня только 1 цифрой, и если это так, он дополняет его значением 1 0.

UPDATE test SET datecol = 
    substr(datecol, 1, 4) || '-' ||  
    CASE substr(datecol, 6, 3)
        WHEN 'Jan' THEN '01'
        WHEN 'Feb' THEN '02'
        WHEN 'Mar' THEN '03'
        WHEN 'Apr' THEN '04'
        WHEN 'May' THEN '05'
        WHEN 'Jun' THEN '06'
        WHEN 'Jul' THEN '07'
        WHEN 'Aug' THEN '08'
        WHEN 'Sep' THEN '09'
        WHEN 'Oct' THEN '10'
        WHEN 'Nov' THEN '11'
        WHEN 'Dec' THEN '12'
        ELSE substr(datecol, 6, 3) 
    END || '-' ||
    CASE substr(datecol, 11, 1)
        WHEN ' ' THEN '0' || substr(datecol, 10)
        ELSE substr(datecol, 10)
    END
0 голосов
/ 22 ноября 2018

Предполагая: -

  1. , что таблица называется convdt и
  2. , что вы хотите изменить (ОБНОВИТЬ) все строки в самой таблицеи
  3. что таблица не определена с использованием ключевых слов WITHOUT ROWID

, тогда я считаю, что это будет делать следующее: -

WITH 
    cte1(rowid,dc1) AS (
    SELECT
        rowid,
        replace(
            replace(
                replace(
                    replace(
                        replace(
                            replace(
                                replace(
                                    replace(
                                        replace(
                                            replace(
                                                replace(
                                                    replace(data,'Jan','01'),
                                                'Feb','02'),
                                            'Mar','03'),
                                        'Apr','04'),
                                    'May','05'),
                                'Jun','06'),
                            'Jul','07'),
                        'Aug','09'),
                    'Sep','09'),
                'Oct','10'),
            'Nov','11'),
        'Dec','12')
    FROM convdt
    ),
    cte2(rowid,dc2) AS ( SELECT rowid,substr(dc1,1,4)||'-'||substr(dc1,6,2)||'-'||substr(dc1,9) FROM cte1)
    UPDATE convdt SET data = (SELECT dc2 FROM cte2 WHERE cte2.rowid = rowid);
    SELECT * FROM convdt;

Используетсядва общих табличных выражения.

Первые cte1 извлекают столбцы rowid , а столбцы data заменяют Jan на 01, Feb на 02 и т. Д. (Называя data столбец как dc1 )

Второй cte2 затем извлекает rowid и столбец dc1 от переформатирования cte1 для соответствия формату ГГГГ-ММ-ДД чч: мм: сс.

Все строки таблицы convdt обновляются, получая значение замены из cte2 в соответствии с rowid .

Рабочий пример / тестовый код

DROP TABLE IF EXISTS convdt; -- For testing only drop the table
CREATE TABLE IF NOT EXISTS convdt (data TEXT); -- For testing only create the table
INSERT INTO convdt VALUES  -- For testing only populate the table
    ('2018 Jan 16 15:53:01'),('2018 Feb 16 15:53:01'),('2018 Mar 16 15:53:01'),('2018 Apr 16 15:53:01'),
    ('2018 May 16 15:53:01'),('2018 Jun 16 15:53:01'),('2018 Jul 16 15:53:01'),('2018 Aug 16 15:53:01'),
    ('2018 Sep 16 15:53:01'),('2018 Oct 16 15:53:01'),('2018 Nov 16 15:53:01'),('2018 Dec 16 15:53:01')
;
SELECT * FROM convdt; -- Extract all the data for comparison before the updates
WITH 
    cte1(rowid,dc1) AS (
    SELECT
        rowid,
        replace(
            replace(
                replace(
                    replace(
                        replace(
                            replace(
                                replace(
                                    replace(
                                        replace(
                                            replace(
                                                replace(
                                                    replace(data,'Jan','01'),
                                                'Feb','02'),
                                            'Mar','03'),
                                        'Apr','04'),
                                    'May','05'),
                                'Jun','06'),
                            'Jul','07'),
                        'Aug','09'),
                    'Sep','09'),
                'Oct','10'),
            'Nov','11'),
        'Dec','12')
    FROM convdt
    ),
    cte2(rowid,dc2) AS ( SELECT rowid,substr(dc1,1,4)||'-'||substr(dc1,6,2)||'-'||substr(dc1,9) FROM cte1)
    UPDATE convdt SET data = (SELECT dc2 FROM cte2 WHERE cte2.rowid = rowid);
    SELECT * FROM convdt; -- Extract all the data to show the result of the conversion

Результаты

До обновления таблицы: -

enter image description here

После преобразования: -

enter image description here

...