【问题标题】:convert date column to another time-zone then group by day of week将日期列转换为另一个时区,然后按星期几分组
【发布时间】:2021-10-23 15:13:15
【问题描述】:

我拥有的部分数据库采用此示例格式:

Value Date (UTC format)
10 Fri Jul 18 02:28:32 +0000 2014
20 Mon Oct 05 10:21:41 +0000 2015
30 Mon Oct 12 09:11:42 +0000 2015

我想根据星期几对值进行分组,以便查询返回如下内容:

Total Count Day of Week (UTC format)
10 Fri
50 Mon

但在此之前,我需要将日期从 UTC 转换为 PDT,这可能会影响星期几。例如,UTC 第一行中的Fri Jul 18 02:28:32 +0000 2014 将是 PDT 中的星期四。因此,我需要先转换时区,然后查询更新的星期几,类似于:

Total Count Day of Week (PDT format)
10 Thu
50 Mon

我尝试使用 SELECT DATETIME(date, 'PDT') 开始查询,但它不起作用。

【问题讨论】:

  • SQLite 的日期函数不适用于您的日期格式。唯一有效的文本格式是 YYYY-MM-DD hh:mm:ss.sss

标签: sql sqlite date sql-update strftime


【解决方案1】:

因为您存储在表格中的日期格式不适用于datetime functions of SQLite
唯一可接受的日期文本格式是 YYYY-MM-DD hh:mm:ss.sss

我建议您使用这种格式更新表格,以便 SQLite 可以直接使用您拥有的日期并且也可以进行比较:

UPDATE tablename 
SET Date = SUBSTR(Date, -4) || '-' ||
           CASE SUBSTR(Date, 5, 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'
           END || '-' ||
           SUBSTR(Date, 9, 11);

然后,加入一个 CTE,将星期几返回到表中并聚合:

WITH cte(nr, day) AS (VALUES ('0', 'Sun'), ('1', 'Mon'), ('2', 'Tue'), ('3', 'Wed'), ('4', 'Thu'), ('5', 'Fri'), ('6', 'Sat'))
SELECT c.day,
       SUM(Value) total_value
FROM tablename t INNER JOIN cte c
ON c.nr = strftime('%w', DATETIME(t.Date, '-7 hour'))
GROUP BY c.day
ORDER BY c.nr;

请参阅demo

如果您不想更改日期格式,则必须在聚合查询中包含将日期转换为正确格式的内容:

WITH cte(nr, day) AS (VALUES ('0', 'Sun'), ('1', 'Mon'), ('2', 'Tue'), ('3', 'Wed'), ('4', 'Thu'), ('5', 'Fri'), ('6', 'Sat'))
SELECT c.day,
       SUM(Value) total_value
FROM tablename t INNER JOIN cte c
ON c.nr = strftime(
            '%w', 
            DATETIME(
              SUBSTR(t.Date, -4) || '-' ||
              CASE SUBSTR(t.Date, 5, 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'
              END || '-' ||
              SUBSTR(t.Date, 9, 11), 
              '-7 hour'
            )
          )
GROUP BY c.day
ORDER BY c.nr;

请参阅demo

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 2011-01-29
    • 2014-01-11
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 2015-02-21
    相关资源
    最近更新 更多