优化SQL查询并动态使用当前日期

Jon*_*ins 2 sql oracle oracle11g oracle-sqldeveloper

我正在尝试优化一个简单的SQL查询,并想知道是否有人有任何建议.我正在使用Oracle SQL Developer(我不喜欢)在Oracle 11g数据库上进行开发.我使用的查询是:

SELECT count(*) 
FROM my_table 
WHERE my_date
BETWEEN TO_DATE('2012-5-09T05.00.00','YYYY-MM-DD"T"HH24:MI:SS') 
AND TO_DATE('2012-5-10T04.59.59','YYYY-MM-DD"T"HH24:MI:SS') 
AND my_code='33' 
GROUP BY my_code;
Run Code Online (Sandbox Code Playgroud)

此外,我希望能够通过将日期的部分更改为当前日期,动态地使用此查询,但我希望能够指定小时.所以我想比较一下:

getdate() + 'T05.00.00'
Run Code Online (Sandbox Code Playgroud)

我不知道如何做到这一点,并且getdate()函数似乎在SQL Developer中不起作用/我不知道如何正确使用它.

所以我正在寻找的是关于如何动态更改我想约束我的结果的日期的日 - 月 - 年部分的优化建议和指针.谢谢!

dcp*_*dcp 5

要获取当前日期,您可以使用SYSDATE.要向其添加x个小时,您可以添加x/24.所以像这样:

示例:获取当前日期+ 5小时

 SELECT SYSDATE + 5/24 FROM dual
Run Code Online (Sandbox Code Playgroud)

所以在你的例子中:

SELECT count(*) 
FROM my_table 
WHERE my_date
BETWEEN sysdate
AND sysdate + 5/24 -- if you want 5 hours ahead, for example
AND my_code='33' 
GROUP BY my_code;
Run Code Online (Sandbox Code Playgroud)

如果您希望能够更改小时数,可以将此代码转换为函数,并将小时和代码作为变量传递.

像这样的东西:

CREATE FUNCTION myfunc
(
   p_num_hours INT
 , p_my_code VARCHAR
) RETURN INT
AS
  l_ret INT;
BEGIN
   SELECT count(*) 
   INTO l_ret
   FROM my_table 
   WHERE my_date
   BETWEEN sysdate
   AND sysdate + p_num_hours/24
   AND my_code=p_my_code 

   RETURN l_ret;
END;
Run Code Online (Sandbox Code Playgroud)