SQL日期和时间格式

时间:2018-12-03 15:56:41

标签: sql sqlite datetime db-browser-sqlite

对某些SQL格式有一个简单的问题。我正在努力弄清楚如何使表的格式相同。该表包含约15年的数据。大多数时间戳都以类似的方式格式化。它们在“日期”,“日期”和“ YT”列中:

“太阳”“ 12月17日”“ 2017 11:58:00 PM”

过去一年的数据格式如下:

“ 1月4日-10:43 AM”

此字符串全部放在一列中; “天”。

我正在寻找一些东西。我需要使用相同的格式,以便可以使用它。因此,希望我可以将“天”列留空,因为它不会告诉我们那是星期几。我想将字符串中的月份和日期部分移动到“日期”列中,以匹配先前的数据。并且我想在时间戳之前添加“ 2018”,并将该值添加到“ YT”列中。

我正在使用数据库浏览器和SQLite。

感谢所有帮助。我是sql和python的新手,如果我错过了明显的内容,请向我道歉。如果我缺少一个简单的解决方案,也将不胜感激一些将我指向正确的方向来阅读它/自己弄清楚它的人。

1 个答案:

答案 0 :(得分:1)

假设您正在使用sqlite:

我创建了一个简单的表来验证结果,如下所示:

DROP TABLE IF EXISTS MY_TABLE;
CREATE TABLE MY_TABLE ("SOME_UNIQUE_ID" INTEGER,"Day" TEXT,"Date" TEXT,"YT" TEXT);
INSERT INTO MY_TABLE ("SOME_UNIQUE_ID","Day","Date","YT") VALUES ("1","Sun","Dec 17","2017 11:58:00 PM");
INSERT INTO MY_TABLE ("SOME_UNIQUE_ID","Day","Date","YT") VALUES ("2","Jan 4 - 10:43 AM","","");

因此,在提交之前的语句之后,运行以下查询...

SELECT * FROM MY_TABLE;

返回...

SOME_UNIQUEID Day                 Date      YT
1             Sun                 Dec 17    2017 11:58:00 PM
2             Jan 4 - 10:43 AM

最后,这是一个大查询,它使用格式正确的datetime列来获取所有记录。您必须修改此查询以匹配表名和列名。

SELECT SOME_UNIQUE_ID, 
    datetime(FULL_DATE_STRING) AS DATETIME_FULL 
    FROM (
        SELECT SOME_UNIQUE_ID,
        coalesce(YYYY_str,"") || "-" || coalesce(MM_str,"") || "-" || coalesce(DD_str,"") || " " || coalesce(HHMMSS_str,"") AS FULL_DATE_STRING
        FROM (
            SELECT SOME_UNIQUE_ID,
                substr(YT,0,5) AS YYYY_str,
                CASE substr("Date",0,4) 
                   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 NULL
                END MM_str,
                substr("Date",5,2) AS DD_str,
                substr(substr(YT, 6),0,9) AS HHMMSS_str
            FROM MY_TABLE
            )
    )
WHERE DATETIME_FULL IS NOT NULL
UNION ALL
SELECT SOME_UNIQUE_ID, 
    datetime(YYYYMMDD_str || " " || HHMMSS_str_mod) AS DATETIME_FULL 
FROM (
    SELECT SOME_UNIQUE_ID, 
        YYYY_str || "-" || MM_str || "-" || DD_str AS YYYYMMDD_str,
        CASE AMPM_str
            WHEN 'AM'
                THEN HHMMSS_str
            WHEN 'PM'
                THEN replace(HHMMSS_str,substr(HHMMSS_str,1,2),substr(HHMMSS_str,1,2)+12)
            ELSE NULL
        END HHMMSS_str_mod
    FROM (
        SELECT SOME_UNIQUE_ID,
            "2018" AS YYYY_str,
            MM_str,
            substr('00'||D_str,-2) AS DD_str,
            HHMMSS_str,
            AMPM_str
        FROM (
            SELECT SOME_UNIQUE_ID,
            CASE substr("Day",1,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 NULL
            END MM_str,
            rtrim(substr("Day",5,2)) AS D_str,
            substr("Day",-8,5) || ":00" AS HHMMSS_str,
            substr("Day",-2,2) AS AMPM_str
            FROM MY_TABLE
            )
        )
    )
WHERE DATETIME_FULL IS NOT NULL
;

返回:

SOME_UNIQUE_ID DATETIME_FULL
1              2017-12-17 11:58:00
2              2018-01-04 10:43:00

您可以从此处以任何所需的格式获取DATETIME_FULL,请参见 https://www.sqlite.org/lang_datefunc.html。另外,python有很多处理日期时间数据的方法,您可以自己搜索它们。