当前位置: 首页 > 面试题库 >

我们如何将昨天下午5点到今天下午5点进行分组以记录到今天的日期

黄磊
2023-03-14
问题内容

甲骨文表

id  timestamp                status
1  2019-10-20 12:34:56.000   approved
1  2019-10-22 12:34:56.000   approved
2  2019-10-20 17:34:56.000   approved
2  2019-10-21 12:34:56.000   approved
3  2019-10-23 18:10:10.000   mod_in_ip
3  2019-10-24 11:10:10.000   approved
3  2019-10-24 12:10:10.000   approved
4  2019-10-25 12:10:10.000   approved
4  2019-10-25 18:10:10.000   approved

我想将id标记为 newedited 。问题是从5pm到5pm的记录中被认为是工作时间段, 即从
‘2019-10-25 17:00:00’到‘2019-10-26 17:00:00’被认为是工作时间段
或昨天的下午5点到今天下午5点是一个工作时间。

例如:如果您查看表格并获得预期结果,则带有昨天6:00 PM记录和今天11AM记录的id记录应标记为new。

预期结果/结果应为

1 edited
2 new
3 new
4 edited

最初我尝试过此方法,但它无法解决上述问题

select id,
case
when count(id)<=1 then 'New' 
else 'Edited' End AS prefix 
from(select id,status ,trunc(timestamp) from table 
where 
status='approved' and id in (1,2,3,4)
group by id,status,trunc(timestamp))
group by id

结果是

1 Edited
2 Edited
3 new
4 new

但预期结果是

1 edited
2 new
3 new
4 edited

我正在寻找解决方案,例如 从5pm到5pminnerquery组记录, 以便外部查询可以正常工作,或者完全不同的解决方案也是可行的

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=abd90416004000043c85316423d64b17


问题答案:

如果要将5pm到5pm视为“同一”天,可以很容易地将Oracle日期向前或向后移动一天的时间(例如,可以将5pm向前移动7小时以成为“下一个”的开始)天)

SQL> create table ora_table (id number, time_data timestamp, status varchar2(30));

Table created.

SQL> insert into ora_table values (1  , to_timestamp('2019-10-20 12:34:56.000', 'yyyy-mm-dd hh24:mi:ss.ff'), 'approved');

1 row created.

SQL> insert into ora_table values (1  , to_timestamp('2019-10-22 12:34:56.000', 'yyyy-mm-dd hh24:mi:ss.ff'), 'approved');

1 row created.

SQL> insert into ora_table values (2  , to_timestamp('2019-10-20 17:34:56.000', 'yyyy-mm-dd hh24:mi:ss.ff'), 'approved');

1 row created.

SQL> insert into ora_table values (2  , to_timestamp('2019-10-21 12:34:56.000', 'yyyy-mm-dd hh24:mi:ss.ff'), 'approved');

1 row created.

SQL> insert into ora_table values (3  , to_timestamp('2019-10-23 18:10:10.000', 'yyyy-mm-dd hh24:mi:ss.ff'), 'mod_in_ip');

1 row created.

SQL> insert into ora_table values (3  , to_timestamp('2019-10-24 11:10:10.000', 'yyyy-mm-dd hh24:mi:ss.ff'), 'approved');

1 row created.

SQL> insert into ora_table values (3  , to_timestamp('2019-10-24 12:10:10.000', 'yyyy-mm-dd hh24:mi:ss.ff'), 'approved');

1 row created.

SQL> insert into ora_table values (4  , to_timestamp('2019-10-25 12:10:10.000', 'yyyy-mm-dd hh24:mi:ss.ff'), 'approved');

1 row created.

SQL> insert into ora_table values (4  , to_timestamp('2019-10-25 18:10:10.000', 'yyyy-mm-dd hh24:mi:ss.ff'), 'approved');

1 row created.

SQL>
SQL> select id, time_data, trunc(time_data) true_date, trunc(time_data+7/24) mapped_date
  2  from ora_table;

        ID TIME_DATA                          TRUE_DATE MAPPED_DA
---------- ---------------------------------- --------- ---------
         1 20-OCT-19 12.34.56.000000 PM       20-OCT-19 20-OCT-19
         1 22-OCT-19 12.34.56.000000 PM       22-OCT-19 22-OCT-19
         2 20-OCT-19 05.34.56.000000 PM       20-OCT-19 21-OCT-19 <===
         2 21-OCT-19 12.34.56.000000 PM       21-OCT-19 21-OCT-19
         3 23-OCT-19 06.10.10.000000 PM       23-OCT-19 24-OCT-19 <===
         3 24-OCT-19 11.10.10.000000 AM       24-OCT-19 24-OCT-19
         3 24-OCT-19 12.10.10.000000 PM       24-OCT-19 24-OCT-19
         4 25-OCT-19 12.10.10.000000 PM       25-OCT-19 25-OCT-19
         4 25-OCT-19 06.10.10.000000 PM       25-OCT-19 26-OCT-19

9 rows selected.


 类似资料:
  • 问题内容: 我想每天下午2点执行工作。我可以使用哪种方法安排工作? 运行2小时后,它将停止工作并重新计划第二天的下午2点。 问题答案:

  • 我想要功能,但是当日期接近时,它太精确了——例如。我不想让它显示“3小时内”,而是“今天”——所以基本上是“每日”精度。 我试着使用函数,如果日期差超过1天,则不格式化

  • 问题内容: 我需要创建两个日期对象。如果当前日期和时间是2012年3月9日上午11:30,则 日期对象d1应该是 2012年3月9日上午12:00 日期对象d2应该包含当前日期本身 日期不会输入,它是系统日期。 更新 : 给出当前日期和时间 问题答案: 应该是IST 2012年3月9日00:00:00

  • 获取今天的日期(年、月、日) 用法 Your browser does not support the video tag. 案例:小闹钟 功能:2019年12月25日,播放圣诞快乐歌

  • 本文向大家介绍Shell中取今天、昨天、前天的时间操作代码,包括了Shell中取今天、昨天、前天的时间操作代码的使用技巧和注意事项,需要的朋友参考一下 1. 取今天时间 2. 取昨天时间 3. 取前天时间 效果展示:

  • 问题内容: 换句话说,我想要提供Joda-Time的功能: 但没有Joda-Time,只有java.util.Date。 不推荐使用.setHours()等方法。有没有更正确的方法? 问题答案: 由于不推荐使用这些方法,因此您可以使用: 如果最终需要一个对象,只需调用