2

我正在尝试优化一个简单的 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;

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

getdate() + 'T05.00.00'

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

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

4

3 回答 3

5

要获取当前日期,您可以使用 SYSDATE。要添加 x 小时数,您可以添加 x/24。所以是这样的:

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

 SELECT SYSDATE + 5/24 FROM dual

所以在你的例子中:

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;

如果您希望能够更改小时数,您可以将此代码制作成一个函数,并将小时数和代码作为变量传递。

像这样的东西:

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;
于 2012-06-01T14:44:49.477 回答
2

作为通过诸如“5 / 24”之类的表达式添加小数天的替代方法,您可能希望使用 INTERVAL 常量。例如:

SELECT count(*)
  FROM my_table
  WHERE my_date BETWEEN (TRUNC(SYSDATE) + INTERVAL '5' HOUR)
                    AND (TRUNC(SYSDATE) + INTERVAL '1' DAY +
                          INTERVAL '5' HOUR - INTERVAL '1' SECOND) AND
        my_code='33'
  GROUP BY my_code

我喜欢使用 INTERVAL 常量,因为很清楚这些常量代表什么。对于小数天常数,我有时会感到困惑('当然,我有时会感到困惑,无论如何...... :-)

分享和享受。

于 2012-06-01T18:43:17.557 回答
0

如果我理解正确,类似

      select count(*) 
    from my_table 
   where trunc(my_date) = trunc(sysdate)
     and my_code = '33' 
group by my_code;

或者

      select count(*) 
    from my_table 
   where my_date
 between sysdate and sysdate + 5/24
     and my_code = '33' 
group by my_code;

HTH。

亚历山德罗

于 2012-06-01T14:45:40.553 回答