如何查询存储过程开始执行时间和结束时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何查询存储过程开始执行时间和结束时间相关的知识,希望对你有一定的参考价值。

需要在存储过程中定义的时候把开始执行时间和结束时间打印出来。

举例如下:

创建存储过程:

create or replace procedure p_testasv_begintime varchar2(20);v_endtime varchar2(20);v_str varchar2(10);begin  v_begintime:=to_char(sysdate,'yyyy-mm-dd hh24:mi:ss');  select 'badkano' into v_str from dual;  v_endtime:=to_char(sysdate,'yyyy-mm-dd hh24:mi:ss');  dbms_output.put_line('开始时间为:'||v_begintime);  dbms_output.put_line('结束时间为:'||v_endtime);end;end;

执行存储过程:


begin  p_test;end;

执行结果:

说明:由于样例存储过程过于简单,但在进行过多数据处理的时候,看到的结果会比较明显。

参考技术A --查看存储过程修改时间
select * from sys.procedures WHERE name = 'proc_name'

--查看存储过程最近执行时间
select * from sys.dm_exec_procedure_stats

--查看存储过程修改时间和最近执行时间
SELECT a.name,b.* FROM sys.procedures a LEFT JOIN sys.dm_exec_procedure_stats b ON a.object_id = b.object_id

SQL查询仅获取事件的开始和结束时间

【中文标题】SQL查询仅获取事件的开始和结束时间【英文标题】:SQL query to get only the start & end time at an event 【发布时间】:2013-11-26 02:15:56 【问题描述】:

我有两张桌子:

Lo​​cations - 存储用户的地理位置和时间戳。 Events - 存储活动的地理范围以及摇滚音乐会活动的开始和结束时间。

是否有查询可以获取活动中所有用户的开始和结束时间?

以下是数据示例:

CREATE TABLE locations (
  user_id INT NOT NULL,
  timestamp DATETIME NOT NULL,
  latitude FLOAT NOT NULL,
  longitude FLOAT NOT NULL
);

INSERT INTO locations (user_id, timestamp, latitude, longitude)
VALUES
  (1, '2013-11-22 01:12:23', 37.7674, -122.439),
  (1, '2013-11-22 01:13:24', 37, -122),
  (1, '2013-11-22 01:14:25', 37.7674, -122.439),
  (2, '2013-11-25 01:12:23', 37.7674, -122.439),
  (2, '2013-11-25 01:13:24', 37, -122),
  (2, '2013-11-25 01:14:25', 37.7674, -122.439);

CREATE TABLE events (
  event_id INT NOT NULL,
  begin_time DATETIME NOT NULL,
  end_time DATETIME NOT NULL,
  min_latitude FLOAT NOT NULL,
  max_latitude FLOAT NOT NULL,
  min_longitude FLOAT NOT NULL,
  max_longitude FLOAT NOT NULL
);

INSERT INTO events (event_id, begin_time, end_time, min_latitude, max_latitude, min_longitude, max_longitude)
VALUES
  (1, '2013-11-22 01:00:00', '2013-11-22 02:00:00', 37.7673, 37.7675, -122.440, -122.439),
  (2, '2013-11-25 01:00:00', '2013-11-25 02:00:00', 37.7674, 37.7674, -122.439, -122.439);

这个问题有两个部分:

第一部分涉及查找用户参加活动的所有行。 第二部分涉及查找用户输入事件的第一个时间戳(然后忽略用户留在事件中的所有后续行),然后获取用户离开事件的行。如果我们只获取用户在事件中的所有行,这将很容易。

以下内容将为我提供用户位置与事件重合的所有行。

select * from locations
join events on 
locations.timestamp between events.begin_time    and events.end_time     and
locations.latitude  between events.min_latitude  and events.max_latitude and
locations.longitude between events.min_longitude and events.max_longitude 

但是,我似乎无法找到一种仅获取用户在活动中的开始和结束时间的好方法。此外,(我不知道这是否会使问题更有趣)用户可以离开并返回到同一个事件。

(我使用的是 MySQL,但我会接受任何 SQL 风格的答案。)

【问题讨论】:

您是否尝试过按 user_id 和 event_id 分组并选择 min(timestamp) 和 max(timestamp)? 是的,感谢您的建议。不幸的是,这无法处理用户离开并返回到同一事件的情况。我想知道他们何时离开并返回参加活动,因此我们不会在这些时间向他们收费。 你怎么知道他们离开又回来了?你的表格没有说清楚。 是的,如果有任何不清楚的地方,我深表歉意。当我们按时间戳对locations 表进行排序时,如果latitudelongitude 曾经在events 范围内,然后在events 范围之外,反之亦然。我们可以确定用户已经离开并返回到某个事件。谢谢。 这听起来像是一个“差距和岛屿”问题。这些similar questions 对你有帮助吗? 【参考方案1】:

试试这个——我想你可以从中得到你想要的。我使用了一个临时表,如果你愿意,你可以通过几种方式之一来避免它,但我认为它更容易可视化。我也可以考虑一些优化,但这对于不太庞大的数据集来说效果很好。可能还有一些我没有想到的边界条件。好的,我可以再限定我的答案吗? . .

--1.Get into temp table
 select e.event_id, l.user_id,l.timestamp into #temp from locations l
left join events e on l.timestamp between e.begin_time and e.end_time 
and l.latitude between e.min_latitude and e.max_latitude 
and l.longitude between e.min_longitude and e.max_longitude 

--2.Get when entered and left event
Select t1.*,
CASE WHEN t1.event_id is not null and isnull(t2.event_id,0)<>t1.event_id
   THEN 'Yes' ELSE 'No' END As EnteredEvent,
CASE WHEN isnull(t1.event_id,0)<>isnull(t2.event_id,-1) and t2.event_id is not null
   THEN 'Yes' ELSE 'No' END As LeftEvent
 from 
(SELECT  t1.*, (
        SELECT  max(timestamp) as t22
        FROM    #temp t2
        WHERE   t1.user_id=t2.user_id and t2.timestamp < t1.timestamp
        ) as priortimestamp
FROM #temp t1) as t1
LEFT JOIN #temp t2 ON t1.user_id=t2.user_id and t1.priortimestamp=t2.timestamp
ORDER BY  t1.user_id, t1.timestamp,t1.event_id

希望对你有帮助

【讨论】:

谢谢,EGP!让我把它翻译成 MySQL,我会马上回来接受这个答案。 效果很好。谢谢你。现在,让我用第二天的时间弄清楚这是如何工作的。 很高兴它有帮助。我不确定这种相关子查询是否有一个确切的术语——我认为它是一个聚合的相关子查询。我认为在 WHERE 子句而不是 SELECT 中有更好的方法,但我没有想到。【参考方案2】:

你能试试这个查询吗,

select user_id, MIN(timestamp) as enteredtime, MAX(timestamp) as exittime 
from 
locations
join 
events 
on 
locations.timestamp between events.begin_time and events.end_time 
and
locations.latitude  between events.min_latitude  and events.max_latitude 
and
locations.longitude between events.min_longitude and events.max_longitude 
GROUP BY locations.user_id

你可以在http://sqlfiddle.com/#!2/e8ba2/1看到demo,希望对你有帮助

【讨论】:

嗨迪皮卡。这将返回用户第一次进入事件的绝对时间和用户最后一次离开事件的绝对时间。但是,我的问题是用户可能多次进入/退出一个事件,在这种情况下使用 MIN()/MAX() 不会反映这些情况。谢谢。

以上是关于如何查询存储过程开始执行时间和结束时间的主要内容,如果未能解决你的问题,请参考以下文章

mssql 语句判断,存储过程最好

mysql中如何创建存储过程

带有 FAST_FORWARD 游标循环的存储过程开始快,结束慢

Oracle测量执行时间存储过程

这样的存储过程会导致死锁吗?

oracle存储过程中循环for in是如何使用的