将日期列转换为另一个时区,然后按星期几分组

convert date column to another time-zone then group by day of week

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

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

我想根据星期几对值进行分组,这样查询就会 return 像这样:

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') 开始我的查询,但它不起作用。

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

我建议您将 table 更新为这种格式,这样您拥有的日期就可以直接被 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);

然后,将 returns 星期几加入 table 的 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