有一个date类型的字段,我想比较日期相等的情况,只比较日期、忽略时间。以下两种情况都能得出正确的比较结果:(忽略字段值的时间,如2010/12/20 15:14:12)
1、MyDate >= '20101220'->查出日期大于等于2010.12.20的记录。
2、MyDate <= '20101220'->查出日期小于2010.12.20的记录,注意是小于而不是小于等于。也就是说跟MyDate < '20101220'结果一样。但是写这样的语句查到的记录数总是0:MyDate = '20101220'。根据上面的说法,这个也查不出来的:MyDate >= '20101220' AND MyDate <= '20101220'请问,怎么比较日期相同的情况呢?前提是不用to_date,to_char转换。

解决方案 »

  1.   

    --首先确定你的数据库中有没有20101220这天的数据
    --给你看个例子
    scott@YPCOST> select hiredate from emp;HIREDATE
    -------------------
    1980-12-17 00:00:00
    1981-02-20 00:00:00
    1981-02-22 00:00:00
    1981-04-02 00:00:00
    1981-09-28 00:00:00
    1981-05-01 00:00:00
    1981-06-09 00:00:00
    1987-04-19 00:00:00
    1981-11-17 00:00:00
    1981-09-08 00:00:00
    1987-05-23 00:00:00
    1981-12-03 00:00:00
    1981-12-03 00:00:00
    1982-01-23 00:00:00已选择14行。scott@YPCOST> select * from emp where hiredate='1980-12-17';     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800        900         20scott@YPCOST> select * from emp where hiredate='19801217';     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800        900         20scott@YPCOST> select * from emp where hiredate='1980/12/17';     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800        900         20
    --我这样查询都没问题的
      

  2.   

    数据肯定是有的。
    请问你的是Oracle数据库吗?我的是date字段,如果输入1980-12-17 00:00:00这样中间带“-”的值,会报错的。
    我换成了MyDate = '2010-12-20'还是查不出来。跟不加入“-”完全一样的效果。
      

  3.   

    何必这么折腾alter session set nls_date_format='yyyymmdd'根据上面的说法,这个也查不出来的:MyDate >= '20101220' AND MyDate <= '20101220' --逻辑就有问题 这个条件始终false最好是to_char trunc,to_date
      

  4.   

    When comparing a character value with a DATE value, Oracle converts the character data to DATE(当比较字符型和日期型的数据时,oracle会把字符型转换为日期型).
    肯定查不到啊oracle隐式类型转换把你的时间20101202转成了2010-10-20 00:00:00但是你的mydate字段是有时分秒的,怎么会相等呢?你只有把你的mydate改成trunc(mydate)就可以了
      

  5.   

    trunc方法返回日期对象的日期值(不包含时间)
      

  6.   

    我这个是有特殊应用的。如果用to_char trunc,to_date转换,肯定没问题。
    但是我这里是动态过滤数据,表名、字段名都动态获取,而字段的类型又取不到,所以在拼条件的时候,无法判断哪个字段是date类型,也就无法知道在哪里应该用to_char trunc,to_date来转换了。其他类型的字段都没问题,就这个date的“等于”判断不出来。
      

  7.   

    很彻底!
    我才发现,如果把date的字段值改在 2010/10/10 00:00:00的话,数据库保存的时候会自动把00:00:00去掉。这个时候再用MyDate = '20101220'就能查出来了。
    看来得换个思路做了。
    小的不才,接触Oracle不久感谢各位大侠的帮忙了。
      

  8.   

    如果可以的话 你也可以把时间写全
    MyDate = '20101220 01:01:01' 
    或者修改你表里的数据 把小时,分,秒去掉
      

  9.   

    虽然查询 date 类型列时默认只会显示年、月、日,但是 date 类型列实际上不但会保存年、月、日,还会将小时、分、秒都保存下来。这样,如果 date 列中保存的时间是 2010-12-20 10:00:00,使用 '20101220' 来比较,是肯定查不出来的,因为 oracle 会将 '20101220' 字符串转换为 2010-12-20 00:00:00 date 类型值。
      

  10.   

    不太明白楼主的意思,不过认为不管怎么样
    要么在=号前加to_date/to_char/trunc或者在=号后加to_date/to_char/trunc,
    要么能算出具体的值
      

  11.   

    MyDate >= '20101220' AND MyDate <= '20101220'
    改为
    MyDate >= To_Date( '20101220', 'YYYYMMDD' ) AND MyDate <= To_Date( '20101220', 'YYYYMMDD' )
    就OK了!你原来的写法是日期类型与字符类型进行比较,当然返回不了你想要的数据!
      

  12.   

    看来 你不能在oracle上想办法了 可不可以在你编程方式上想想办法
      

  13.   

    嗯,现在是在程序中独立处理date字段了。
      

  14.   

    如果把字段截取,就不能用等号,这个我也吃过亏
    我的库里存的是年月日时分秒,但是比较的时候只取年月日,用>=能把当天的取出来
    用<=就取不到,后来才知道,要么转换成date再比,要么用<=的时候把后面的值加一天
      

  15.   

    假设字段的值是20101010 10:10:10 
    你用colvalue>=20101010是可以的,但是colvalue<=20101010就查不出来