обновить или преобразовать значение даты и времени в базу данных sqlite - PullRequest
2 голосов
/ 08 ноября 2019

У меня есть база данных SQLite со столбцом TEXT, в которой хранится значение DateTime, сформированное следующим образом: «11/08/2019 00:00:00». Я хотел бы преобразовать все содержимое столбца в метку времени UTC Epoch по местному часовому поясу. Существует ли строка SQL обновления с функцией DateTime, которую я мог бы запустить, используя поддерживаемый синтаксис SQL для выполнения этой задачи, или мне, возможно, просто написать быстрое консольное приложение C # для этого? Я не нашел ни одного примера в Интернете или в SO, который бы делал то, что мне нужно делать в этой ситуации.

1 Ответ

2 голосов
/ 09 ноября 2019

Можно использовать SQL ОБНОВЛЕНИЕ, например: -

UPDATE mytable SET mycolumn = 
CASE WHEN substr(mycolumn,3,1) = '/' 
    THEN
        strftime('%s',substr(mycolumn,7,4)||'-'||substr(mycolumn,4,2)||'-'||substr(mycolumn,1,2)||' '||substr(mycolumn,12,8))
    ELSE
        mycolumn
    END
; 

.

Пример

Возможно, рассмотрим следующее, которое преобразует столбец (или нет, если онуже был преобразован (или нет, если он не соответствует формату дд / мм / гггг))

  • Обратите внимание, что ниже просто проверяется 3-й символ для / , более строгогопроверка может быть использована при желании.

: -

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (mycolumn TEXT);
/* Load the testing data */
INSERT INTO mytable VALUES 
    ('11/08/2019 00:00:00'),
    ('01/08/2019 00:00:00'),
    ('31/01/2019 00:00:00'),
    ('31/01/2019 13:25:33.004') /* test for micro seconds (dropped by utc)*/;
/* display data before conversion */
SELECT * FROM mytable; 
/* Convert the data to unix */
UPDATE mytable SET mycolumn = 
    CASE WHEN substr(mycolumn,3,1) = '/' 
        THEN
            strftime('%s',substr(mycolumn,7,4)||'-'||substr(mycolumn,4,2)||'-'||substr(mycolumn,1,2)||' '||substr(mycolumn,12,8))
        ELSE
            mycolumn
        END
    ;
    /* Display data as is, as formatted localised and as formatted UTC */
SELECT *, datetime(mycolumn,'unixepoch','localtime') AS local, datetime(mycolumn,'unixepoch') AS utc FROM mytable;
  • Обратите внимание, что вышеприведенное НЕ будет обслуживать такие даты, как 01.01.2009, напримердля дат потребуется более сложное предложение CASE.

  • Обратите внимание, что UTC - это всемирное координированное время, т.е. сохраняется одно значение, которое вы настраиваете из UTC в соответствии с часовым поясом

Результаты

  • Примечание тестирование в часовом поясе, который составляет +10 часов

При первом запуске результаты: -

Предварительное преобразование:-

enter image description here

Post-convserion

enter image description here

Rerun (DROP прокомментировалушел)

Предварительное преобразование (смешанные данные): -

enter image description here

  • данные обведены в кружок

Сообщение-конверсия: -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...