【发布时间】:2021-04-02 03:33:47
【问题描述】:
任何人都可以帮助我在提交记录后仅在下午 8:30 到下午 6:00 之间查询两个日期
如果在上午 8:30 到下午 6:00 之间提交记录,则将计为 1 天。如果在下午 6:00 之后提交记录,它将在第二天记录
【问题讨论】:
标签: sql oracle datetime oracle11g count
任何人都可以帮助我在提交记录后仅在下午 8:30 到下午 6:00 之间查询两个日期
如果在上午 8:30 到下午 6:00 之间提交记录,则将计为 1 天。如果在下午 6:00 之后提交记录,它将在第二天记录
【问题讨论】:
标签: sql oracle datetime oracle11g count
如果在下午 6:00 之后提交记录,它将在第二天记录:
如果您想从前一天的 18:00 到当天的 18:00 按天计算日期,那么您可以在截断之前将 6 小时减去 1 秒添加到日期,然后按此分组:
SELECT TRUNC( date_column + INTERVAL '5:59:59' HOUR TO SECOND ) AS date_column,
COUNT(*)
FROM table_name
GROUP BY
TRUNC( date_column + INTERVAL '5:59:59' HOUR TO SECOND )
ORDER BY
date_column;
其中,对于样本数据:
CREATE TABLE table_name ( date_column ) AS
SELECT DATE '2020-01-01' + LEVEL * INTERVAL '1' HOUR
FROM DUAL
CONNECT BY LEVEL <= 50;
输出:
DATE_COLUMN |数数(*) :----------------- | --------: 2020-01-01 00:00:00 | 18 2020-01-02 00:00:00 | 24 2020-01-03 00:00:00 | 8
db小提琴here
【讨论】:
您可以尝试使用CASE:如果日期列称为datum(如我的示例中)并且其小时在18:00(即下午6点)之后,则将其设为“明天上午 10 点”(所以它适合第二天)。否则,取“今天”日期。像这样的:
with data as
(select t.*,
case when to_char(t.datum, 'hh24mi') > '1800' then trunc(t.datum + 1) + 10/24
else t.datum
end datum
from your_table t
)
select trunc(d.datum) datum,
count(*)
from data d
group by trunc(d.datum)
【讨论】:
18:00:01 在18:00:00 之后,但这不会转移到第二天,直到19:00:00。