您最好的选择是存储 atimestamp
或timestamptz
( timestamop with time zone
)。如果您已经或曾经必须处理多个时区,请确定timestamptz
并定义您是要使用当地时间还是 UTC 或其他时间进行操作。此相关答案中的更多详细信息:
在 Rails 和 PostgreSQL 中完全忽略时区
演示如何有效地将时间戳转换为当前周(一周中的同一天和时间)。假设timestamp
这里:
SELECT date_trunc('week', now()::timestamp) + (t - date_trunc('week', t))
FROM (SELECT '2013-02-15 12:00:00'::timestamp AS t) x;
诀窍是计算interval
相应周的开始与给定周之间的时间,timestamp
并借助 .将其添加到当前周的开始date_trunc()
。
ISO 周从星期一开始,最后是星期日。
或者,只为给定的时间增加一周timestamp
:
SELECT t + interval '1 week';
如果你只想ORDER BY
,你只需要间隔:
ORDER BY (t - date_trunc('week', t))
如果您想将星期日放在首位(换班日):
ORDER BY ((t + interval '1d') - date_trunc('week', (t + interval '1d'))
或更简单:
ORDER BY EXTRACT(dow FROM t), t::time
引用有关 EXTRACT() 的手册:
dow
星期天(0)到星期六(6)
isodow
星期一(1)到星期日(7)是星期几
在评论中回答问题
我只对相对于当前日期订购它们感兴趣。即如果是星期二,我想先是星期二,最后是星期一。
在“今天”的午夜包装:
ORDER BY (EXTRACT(dow FROM t)::int + 7 - EXTRACT(dow FROM now())::int) % 7
,t::time
使用模运算符%
根据“今天”移动日期。
使用dow
而不是isodow
,因为从开始0
变得%
更简单。