Я считаю, что может подойти следующее.
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;
Результат: -
