首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化SQL查询并动态使用当前日期

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

Stack Overflow用户
提问于 2012-06-01 22:34:46
回答 3查看 9.2K关注 0票数 2

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

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
getdate() + 'T05.00.00'

我不知道该怎么做,而且getdate()函数在SQL Developer中似乎不起作用/我不知道如何正确使用它。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-01 22:44:49

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

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

代码语言:javascript
复制
 SELECT SYSDATE + 5/24 FROM dual

因此,在您的示例中:

代码语言:javascript
复制
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;

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

如下所示:

代码语言:javascript
复制
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;
票数 5
EN

Stack Overflow用户

发布于 2012-06-02 02:43:18

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

代码语言:javascript
复制
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

我喜欢使用区间常量,因为很清楚这些常量代表了什么。对于小数日常量,我有时会感到困惑(‘当然,我有时会感到困惑,不管... :-)

分享和享受。

票数 2
EN

Stack Overflow用户

发布于 2012-06-01 22:45:41

如果我没理解错的话,就像

代码语言:javascript
复制
      select count(*) 
    from my_table 
   where trunc(my_date) = trunc(sysdate)
     and my_code = '33' 
group by my_code;

代码语言:javascript
复制
      select count(*) 
    from my_table 
   where my_date
 between sysdate and sysdate + 5/24
     and my_code = '33' 
group by my_code;

HTH。

Alessandro

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10852249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档