`
tianhandigeng
  • 浏览: 374402 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Oracle 时间段查询

阅读更多

    需求:根据用户输入的时间段查询出记录。

Oracle数据库中一个一个存放时间的字段,字段类型是DATE型的,其中有这样的两条数据



 这个字段存有时分秒,用户输入的时候是按日期来查询的,也就是说只有年月日,最初我是这样查询的:

select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-16','yyyy-MM-dd');

 这样查询的话2011/6/16这条记录是查不出来的,因为字段存了时分秒。

最后通过群里的朋友的指点改成了这样:

select * from tb_product where to_char(createdate,'yyyy-MM-dd')>='2011-6-13' and to_char(createdate,'yyyy-MM-dd')<='2011-6-16';

 这样也查不出来,不是语句错了,而是我日期格式错了,日期格式是‘yyyy-MM-dd’这样的,而我写的是2011-6-13,改成

2011-06-13和2011-06-16就可以了。

   上面的方法就是只按照日期查询的方法了,各位有更好的方法,请留言。

 

 

  • 大小: 4.2 KB
分享到:
评论
34 楼 lylovejava0 2013-01-25  
数据库里字段不能转换。。这样会慢死。。在说如果表里有分区等设置那你的分区就不会起作用 反而走了反作用。。
赞同select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=? 这个方式
33 楼 liujianche11 2011-06-21  
小心点  createdate<=to_date('2011-6-16','yyyy-MM-dd')是查不出6月16号 带时分秒的数据的 最好写全
32 楼 iceside 2011-06-21  
1.建函数索引
2.用第一种方法,注意to_date的范围应该是 00:00
31 楼 zhangjie.0211 2011-06-20  
字符串, 直接>或者<
30 楼 tiannet 2011-06-20  
hzl7652 写道
楼主可以将起始时间转化成
'年-月-日 00:00:00'
终止时间转化成
'年-月-日 23:59:59'
再传给oracle,这样sql也不需要进行什么加1的运算了


常用这种方法。
29 楼 红蚂蚁 2011-06-20  
wxwdt 写道
select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=?
用trunc函数就可以了

只能说能实现
28 楼 红蚂蚁 2011-06-20  
nirvana1988 写道
fengyexjtu 写道
wad12302 写道
select * from tb_product where

createdate > to_date('2011-6-15','yyyy-MM-dd') - 1

and

createdate<=to_date('2011-6-16','yyyy-MM-dd') + 1;


个人认为这种方式好一些

+1

最标准的,别的都比较傻。
27 楼 openFox 2011-06-20  
nakupanda 写道
yongqi 写道
我不明白
select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-17','yyyy-MM-dd'); 


这样的写法2011/6/16这条记录为什么查不出来,我一直是这样用的,没发现这个问题?谁讲一下?



不明白TOO



2011/6/16没记录....
26 楼 chansman 2011-06-20  
richard_2010 写道
wxwdt 写道
select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=?
用trunc函数就可以了



+1


select * from tb_product where createdate>=to_date('2011-06-13','yyyy-MM-dd') and createdate<=to_date('2011-06-16','yyyy-MM-dd'); 
注意临界时间2011-06-16指得是2011-06-16 00:00:00
25 楼 chansman 2011-06-20  
tianhandigeng 写道
chansman 写道
你还是应该使用第一种方法,因为第二种方法吧数据库中所有的数据都做了 to_char.
to_date 是 yyyy-mm-dd 不是MM 同时你还应该注意临界时间

把数据库中所有的数据都做了 to_char. 这怎么里面,是数据库中所有的记录都这样处理了?


不要对数据库中的子段做操作.
24 楼 richard_2010 2011-06-19  
wxwdt 写道
select * from tb_product where trunc(createdate)>=? and trunc(createdate)<=?
用trunc函数就可以了



+1
23 楼 tianhandigeng 2011-06-19  
yongqi 写道
我不明白
select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-17','yyyy-MM-dd'); 


这样的写法2011/6/16这条记录为什么查不出来,我一直是这样用的,没发现这个问题?谁讲一下?

写错了 是2011-6-16
22 楼 yongqi 2011-06-18  
tfwin2 写道
yongqi 写道
我不明白
select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-17','yyyy-MM-dd'); 


这样的写法2011/6/16这条记录为什么查不出来,我一直是这样用的,没发现这个问题?谁讲一下?




这么用是没问题的,估计楼主的代码或语句有问题,oracle的时间段,是可以这样查的,
经严格测试,至少9I,10G两个版本,这么查没有问题,2011/6/16是可以查出来得,依据楼主对数据库知识的匮乏度,只能推测,代码出错。。。。


我用的是10g,确实没遇到过这样的问题。
21 楼 redish 2011-06-18  
select * from tb_product where createdate>=to_date('2011-06-13','yyyy-MM-dd') and createdate<=to_date('2011-06-17','yyyy-MM-dd');  
这样可以查询出来,楼主怎么就查不出来?

另外数据库时间格式也可用字符串格式varchar2(14)  (YYYYMMDDHH24MISS) ,因为不涉及到国外的时间,这样使用很简便。
20 楼 tfwin2 2011-06-18  
在时间戳这种字段一般都会带有索引,任何函数转换 如TO_CHAR,TRUNC,都会使索引失效,查询速度影响巨大,除非冒更大的风险将索引建在函数基础上。
ORACLE中日期是以7位长的数值储存的,如果我没记错,应该是针对1970年的一个偏移量,
故2011/6/17的偏移量,一定大于2011/6/16 23:59:59秒
所以查不出,不可能是数据库设计问题,只能是使用问题。
仔细想想也知道,如果日期查询还要用字符串做比较,那oracle花这么大劲设计一套跟其他数据库都不同的日期处理机制做什么?
19 楼 tfwin2 2011-06-18  
yongqi 写道
我不明白
select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-17','yyyy-MM-dd'); 


这样的写法2011/6/16这条记录为什么查不出来,我一直是这样用的,没发现这个问题?谁讲一下?




这么用是没问题的,估计楼主的代码或语句有问题,oracle的时间段,是可以这样查的,
经严格测试,至少9I,10G两个版本,这么查没有问题,2011/6/16是可以查出来得,依据楼主对数据库知识的匮乏度,只能推测,代码出错。。。。
18 楼 hzl7652 2011-06-18  
楼主可以将起始时间转化成
'年-月-日 00:00:00'
终止时间转化成
'年-月-日 23:59:59'
再传给oracle,这样sql也不需要进行什么加1的运算了
17 楼 wad12302 2011-06-18  
wad12302 写道
select * from tb_product where

createdate > to_date('2011-6-15','yyyy-MM-dd') - 1

and

createdate<=to_date('2011-6-16','yyyy-MM-dd') + 1;


上面写有问题:

好像是应该是

>=  aaa

and

<  bbb - 1



已修改为这种方式
16 楼 nakupanda 2011-06-18  
yongqi 写道
我不明白
select * from tb_product where createdate>=to_date('2011-6-13','yyyy-MM-dd') and createdate<=to_date('2011-6-17','yyyy-MM-dd'); 


这样的写法2011/6/16这条记录为什么查不出来,我一直是这样用的,没发现这个问题?谁讲一下?



不明白TOO
15 楼 way 2011-06-18  
wad12302 写道
select * from tb_product where

createdate > to_date('2011-6-15','yyyy-MM-dd') - 1

and

createdate<=to_date('2011-6-16','yyyy-MM-dd') + 1;

不需要-1吧,上面那种就是从6月15号0时0分0秒开始查询的,-1就从14号开始查了

相关推荐

    sql查询oracle时间段操作

    除了上述方法,Oracle的行版本控制(RAC)也支持时间段查询。启用RAC后,每个数据行都有一个时间戳,使得查询在特定时间点的行版本成为可能。 在实际应用中,结合使用这些工具和特性,可以高效地管理和恢复Oracle...

    Oracle–查询时间段内执行的sql、Produce

    1.查询时间段内执行的sql、Produce select * from v$sqlarea a where 1=1 and a.LAST_ACTIVE_TIME &gt;= to_date( '2013-02-21 18:23:00','yyyy-MM-dd HH24:mi:ss') and a.LAST_ACTIVE_TIME &lt; to_date( '2013-...

    Oracle时间区间段合并.pdf

    在Oracle数据库中,时间区间段的合并是...总结来说,Oracle时间区间段合并的算法利用了窗口函数和分组来识别和合并连续的时间段,能够有效地处理和分析时间序列数据,对于优化数据处理流程和提高查询效率具有重要意义。

    oracle 根据时间段做报表统计

    oracle 根据时间段做报表统计 SQL是时间段统计 SQL原句

    oracle按指定时间查询数据如果未查询到继续递减时间段查询(存储过程)

    本文将详细解析一个特定的Oracle存储过程,该过程旨在按指定时间查询数据,如果未查询到,则继续递减时间段进行查询,直至找到数据或达到预设的时间下限。 ### 核心知识点:Oracle存储过程与时间窗口查询 #### 1. ...

    oracle抓取指定时间段AWR报告实例说明 .docx

    ### Oracle抓取指定时间段AWR报告实例说明 #### 背景介绍 在日常的数据库运维工作中,我们经常需要对Oracle数据库的性能进行监控与优化。自动工作负载资料库(Automatic Workload Repository,简称AWR)是Oracle 10...

    Oracle 导出某时间段AWR与ASH性能报告操作日志

    ### Oracle 导出某时间段AWR与ASH性能报告操作日志 #### 一、Oracle AWR与ASH简介 ##### 1.1 AWR (Automatic Workload Repository) 在Oracle数据库环境中,AWR是一种自动化的工具,它收集并存储有关数据库工作...

    oracle 闪回查询

    此外,UNDO_RETENTION 参数也需要设置为合适的值,以确定可以闪回查询的时间段。 Flashback Query 的使用方式有两种:一种是使用 SQL 语句的 AS OF 子句,另一种是使用 DBMS_FLASHBACK 包。通过 AS OF 子句,用户...

    ORACLE中SQL查询优化技术

    2. **使用分区**:将`ORDERS`表按`ORDER_DATE`字段进行范围分区,以便快速定位到特定时间段的数据。 3. **调整初始化参数**:增加`db_buffer_cache`大小,以便更多的数据能够被缓存在内存中,减少磁盘I/O操作。 ###...

    oracle回滚段使用率过高之解决方法

    情况四:可以优化事务的执行计划,减少事务的执行时间,降低回滚段的使用率。 五、总结 Oracle 回滚段是一个重要的数据库机制,它用于存放数据修改之前的值,以便在事务回滚或恢复时使用。然而,回滚段使用率过高...

    oracle 回滚段探究

    1. **一致性读**:在多用户并发环境中,为了防止用户在执行查询时看到其他未提交的事务数据,Oracle利用回滚段来提供一致性读视图。当一个事务开始时,其操作的数据变化前的状态会被保存到回滚段中,这样即使有其他...

    oracle 常用SQL查询

    在Oracle数据库管理中,SQL查询是日常操作的核心部分,它用于获取、分析和操作数据库中的数据。以下是一些常用的Oracle SQL查询,这些查询涵盖了从基础的表空间信息到复杂的数据库对象状态和性能监控。 1. **查看表...

    深入解析oracle的回滚段

    对于长时间运行的查询,Oracle会构建一个基于当前系统改变号(SCN)的读一致性视图,避免看到中间状态的数据。 回滚段分为几种类型: 1. **系统回滚段**:默认创建,专门用于存储系统表空间的对象的前影像。 2. *...

    oracle数据库回滚段专题解析

    这种方式有助于长时间运行的查询避免看到其他事务产生的未提交修改,从而保证了数据的一致性和准确性。 #### 设置读一致性级别 Oracle默认提供的是SQL语句级别的读一致性,可以通过以下两种方式来实现事务级别的读...

    oracle查看执行最慢与查询次数最多的sql语句

    本文将详细介绍如何查看Oracle数据库中执行最慢和查询次数最多的SQL语句,以帮助DBA(数据库管理员)识别潜在的性能瓶颈。 首先,我们来看如何查询执行最慢的SQL语句。在Oracle中,可以使用`v$sqlarea`视图来获取...

    Oracle用户数据字典以及查询表字段

    ### Oracle用户数据字典以及查询表字段 在Oracle数据库中,数据字典是存储数据库元数据(即关于数据的数据)的特殊集合。这些元数据包括了数据库对象的名称、类型、属性等信息。数据字典对于数据库管理员和开发人员...

    Oracle常用SQL查询语句

    根据提供的信息,我们可以总结出以下Oracle数据库中常用的SQL查询语句及它们的功能: ### 1. 查询表空间及其总大小 ```sql SELECT t.tablespace_name, ROUND(SUM(bytes / (1024 * 1024)), 0) AS ts_size FROM dba...

    sql时间段查询

    ### SQL 时间段查询详解 #### 一、概述 在处理具有日期时间字段的数据时,我们经常需要筛选出特定时间段内的数据。例如,在本案例中,需要获取某表中7月1日至7月31日之间晚上10点到早上6点的数据。这种查询涉及到...

    oracle中查询两年之间某一个月的数据

    在Oracle数据库中,查询特定时间范围内的数据是一项常见的任务,特别是在需要分析某个特定月份或时间段的数据时。根据提供的标题、描述、标签以及部分内容,本文将详细介绍如何在Oracle中查询两年之间某一个月的数据...

    使用LabVIEW操作ACCESS、MySQL、SQL server数据库实现按照时间段查询数据

    在LabVIEW中操作数据库,尤其是实现按时间段查询数据,需要借助特定的工具包。本教程主要涉及使用官方数据库工具包“Database Connectivity Toolkit”,该工具包包含29个函数,能够实现数据库连接、增删改查及数据...

Global site tag (gtag.js) - Google Analytics