簡體   English   中英

按一天中的時刻分組小時

[英]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;

要點:

  • @lanzz 關於extract()是正確的。
  • 使用子查詢計算一天中的小時可以大大簡化代碼。
  • GROUP BYcount()ORDER BYLIMIT可以發生在一個查詢級別。
  • 結果是要求的一天中最常見的時刻

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM