как обновить формат даты / времени в sqlite? - PullRequest
0 голосов
/ 06 ноября 2018

Я искал, чтобы изменить мой Order_Date формат на существующие данные.

В моей базе данных SQLite более 3000 строк.

Я хочу обновить все строки из этого формата 29/09/2018 1:03:44 AM до yyyy-MM-dd HH:mm, есть ли способ сделать это?

My Order_Date Тип данных столбца TEXT

Пока я пытался

UPDATE Orders SET Order_Date = strftime(Order_Date, '%Y-%M-%d %H:%m')

Но приведенный выше запрос обновил все мои строки до нуля

Ответы [ 2 ]

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

Я считаю, что может подойти следующее.

UPDATE ORDERS
    SET order_date =
    CASE 
        WHEN length(order_date) = 21 AND substr(order_date,20,2) = 'AM' THEN
            substr(order_date,7,4)||'-'||substr(order_date,4,2)||'-'||substr(order_date,1,2)||' '
                ||'0'||substr(order_date,12,4)
        WHEN length(order_date) = 21 AND substr(order_date,20,2) = 'PM' THEN
            substr(order_date,7,4)||'-'||substr(order_date,4,2)||'-'||substr(order_date,1,2)||' '
                ||CAST(CAST(substr(order_date,12,1) AS INTEGER) + 12 AS TEXT)||substr(order_date,13,3)
        WHEN length(order_date) = 22 AND substr(order_date,21,2) = 'AM' THEN
                substr(order_date,7,4)||'-'||substr(order_date,4,2)||'-'||substr(order_date,1,2)||' '
                ||substr(order_date,12,5)
        WHEN length(order_date) = 22 AND substr(order_date,21,2) = 'PM' THEN 
                substr(order_date,7,4)||'-'||substr(order_date,4,2)||'-'||substr(order_date,1,2)||' '
                ||CAST(CAST(substr(order_date,12,2) AS INTEGER) + 12 AS TEXT)||substr(order_date,14,3)
    END
;

Это обслуживает переменную длину, поскольку час состоит из 1 или 2 цифр. Однако он не справился бы, если бы день был также 1 цифрой, когда он меньше 10.

Внедрение этого в тест согласно: -

DROP TABLE IF EXISTS orders;
CREATE TABLE IF NOT EXISTS orders (order_date TEXT);
INSERT INTO orders VALUES
    ('29/09/2018 1:03:44 AM'),
    ('29/09/2018 1:03:44 PM'),
    ('29/09/2018 11:03:44 AM'),
    ('29/09/2018 11:03:44 PM');

UPDATE ORDERS
    SET order_date =
    CASE 
        WHEN length(order_date) = 21 AND substr(order_date,20,2) = 'AM' THEN
            substr(order_date,7,4)||'-'||substr(order_date,4,2)||'-'||substr(order_date,1,2)||' '
                ||'0'||substr(order_date,12,4)
        WHEN length(order_date) = 21 AND substr(order_date,20,2) = 'PM' THEN
            substr(order_date,7,4)||'-'||substr(order_date,4,2)||'-'||substr(order_date,1,2)||' '
                ||CAST(CAST(substr(order_date,12,1) AS INTEGER) + 12 AS TEXT)||substr(order_date,13,3)
        WHEN length(order_date) = 22 AND substr(order_date,21,2) = 'AM' THEN
                substr(order_date,7,4)||'-'||substr(order_date,4,2)||'-'||substr(order_date,1,2)||' '
                ||substr(order_date,12,5)
        WHEN length(order_date) = 22 AND substr(order_date,21,2) = 'PM' THEN 
                substr(order_date,7,4)||'-'||substr(order_date,4,2)||'-'||substr(order_date,1,2)||' '
                ||CAST(CAST(substr(order_date,12,2) AS INTEGER) + 12 AS TEXT)||substr(order_date,14,3)
    END
;
SELECT * FROM orders;

Результат: -

enter image description here

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

Мои предположения: год состоит из 4 цифр, а каждый месяц, день, час, минуты - 2 цифры.
Я проверил приведенный ниже код, и он, кажется, работает:

UPDATE Orders 
    SET Order_Date = 
        substr(datetime(substr(Order_Date, 7, 4) || '-' || substr(Order_Date, 4, 2) || '-' || substr(Order_Date, 1, 2) || ' ' 
        || substr(Order_Date, 12, 2) || ':' || substr(Order_Date, 15, 2), 
        '+' || 
        CASE substr(Order_Date, length(Order_Date)-1)
            WHEN 'PM' THEN '12'
            ELSE '0' 
        END 
        || ' hours'), 1, 16)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...