Oracle:如何查询datetime列中的null不为null和null值?

时间:2016-05-31 09:27:20

标签: sql oracle datetime

我希望查询datetime列不为null和null值。 但我查询现在没有空值。我想查询两个值。

查询:

select l.com_code,
       l.p_code,
       to_char(l.effdate,'dd/mm/yyyy') effdate,to_char(l.expdate,'dd/mm/yyyy') expdate
from RATE_BILL l
where ( to_date('02/06/2016','dd/mm/yyyy') <= to_date(l.effdate,'dd/mm/yyyy') 
   or to_date('02/06/2016','dd/mm/yyyy') <= to_date(l.expdate,'dd/mm/yyyy') )

数据样本

com_code | p_code | effdate    | expdate
A        | TEST01 | 01/01/2016 | 31/05/2016
A        | Test01 | 01/06/2016 |

查询结果:

com_code | p_code | effdate    | expdate
A        | TEST01 | 01/01/2016 | 31/05/2016
A        | Test01 | 01/06/2016 |

列expdate 如果null =&#39; 31/12 / 9998&#39;但在DB中显示为null 当查询datetime =&#39; 02/06 / 2016&#39;介于两者之间应该导致这个

com_code | p_code | effdate    | expdate    
A        | Test01 | 01/06/2016 |

但查询

where ( to_date('31/05/2016','dd/mm/yyyy') <= to_date(l.effdate,'dd/mm/yyyy') or to_date('31/05/2016','dd/mm/yyyy') <= to_date(l.expdate,'dd/mm/yyyy') )

结果

A        | TEST01 | 01/01/2016 | 31/05/2016
A        | Test01 | 01/06/2016 |

值Datetime是&#34; Now Datetime&#34;

2 个答案:

答案 0 :(得分:0)

我不明白你的问题的细节,但我认为你在比较空值方面遇到了问题。

通过比较忽略空值。要选择这些列,您应该明确检查reflect

e.g。

l.effdate is null

答案 1 :(得分:0)

首先,我必须承认,我不确定从你的措辞[没有违法行为]中理解你的文字的含义。如果此答案无法满足您的需求,请随时发表评论。

查询的where条件建立在表/视图的列及其sql数据类型上。无需将datetime列转换为datetime数据类型。

此外,它在这里可能有害,因为它意味着隐式转换:

CREATE TABLE [dbo].[Sales] (
    [Id]              VARCHAR (150)   NOT NULL,
  ...
    [ImportHistoryId] INT             NOT NULL,
  ...
    CONSTRAINT [FK_Sales_ImportHistory] FOREIGN KEY ([ImportHistoryId]) REFERENCES [dbo].[ImportHistory] ([Id])
);

因此将where条件更改为:

date column
    -> char /* implicit, default format */
        -> date /* express format;
                   in general will differ from the format the argument
                   string follows
                 */

为了满足空值,使用足够大的&#39;补充where条件。要在db列中显示空值的情况下进行比较的日期时间:

where to_date('02/06/2016','dd/mm/yyyy') <= l.effdate
   or to_date('02/06/2016','dd/mm/yyyy') <= l.expdate

您可以自由使用不同的截止日期。例如,您可能希望在where to_date('02/06/2016','dd/mm/yyyy') <= nvl(l.effdate, to_date('12/31/9998','dd/mm/yyyy')) or to_date('02/06/2016','dd/mm/yyyy') <= nvl(l.expdate, to_date('12/31/9998','dd/mm/yyyy')) 不为空时使用expdate,否则使用当前日期时间:

rate_bill