我正在尝试优化一个简单的SQL查询,不知道是否有人有任何建议。我正在Oracle 11g数据库上使用Oracle SQL Developer (我不喜欢)进行开发。我使用的查询是:
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中似乎不起作用/我不知道如何正确使用它。
因此,我正在寻找的是关于如何动态更改我想要限制结果的日期的日-月-年部分的优化建议和指针。谢谢!
发布于 2012-06-01 22:44:49
要获取当前日期,可以使用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-02 02:43:18
作为通过诸如"5 / 24“之类的表达式添加小数天的替代方法,您可能希望使用间隔常量。例如:
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我喜欢使用区间常量,因为很清楚这些常量代表了什么。对于小数日常量,我有时会感到困惑(‘当然,我有时会感到困惑,不管... :-)
分享和享受。
发布于 2012-06-01 22:45:41
如果我没理解错的话,就像
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。
Alessandro
https://stackoverflow.com/questions/10852249
复制相似问题