[英]Grouping hours by moment of the day
我需要在一組記錄中獲取一天中最常見的時刻(黎明、早晨、傍晚、夜晚)。 我正在嘗試使用 CASE-WHEN 對結果進行分組,但我無法比較日期和整數。 我試試這個:
SELECT done_at,
case done_at
when date_trunc('hour', done_at) > 0 and date_trunc('hour', done_at) <= 7 then
'dawn'
when dayhour > 7 and dayhour <= 12 then
'morning'
when dayhour > 12 and dayhour <= 20 then
'evening'
when dayhour > 20 and dayhour <= 00 then
'night'
end
FROM iterations;
但是得到這個錯誤:
ERROR: operator does not exist: timestamp without time zone > integer LINE 3: when date_trunc('hour', done_at) > 0 and date_trunc('h...
我也嘗試將類型轉換為整數,但我得到了這個:
ERROR: cannot cast type timestamp without time zone to integer LINE 3: when date_trunc('hour', done_at)::integer > 0 and date...
問題是done_at
確實有一個時區。 從 Rails 控制台:
?> Iteration.first.done_at
=> Fri, 23 Sep 2011 02:00:00 CEST +02:00
而現在我一無所知。 如何獲得一天中的時刻?
查詢可能如下所示:
SELECT CASE
WHEN h >= 0 AND h <= 7 THEN 'dawn' -- including 0 !
WHEN h > 7 AND h <= 12 THEN 'morning'
WHEN h > 12 AND h <= 20 THEN 'evening'
WHEN h > 20 THEN 'night'
END AS moment
, count(*) AS cnt
FROM (
SELECT extract(hour from done_at) AS h
FROM iterations
) x
GROUP BY 1
ORDER BY count(*) DESC
LIMIT 1;
extract()
是正確的。GROUP BY
、 count()
、 ORDER BY
和LIMIT
可以發生在一個查詢級別。 done_at
顯然是類型timestamptz
。 所以提取的小時取決於當前會話的時區設置。 要刪除此依賴項,您可能需要明確定義要使用的時區:
extract(hour FROM done_at AT TIME ZONE 'Europe/Vienna') AS h
看:
你想要extract(hour from done_at)
而不是date_trunc('hour', done_at)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.