0

我们必须修改日期列以便相应地过滤数据:

table_id - type - date
 1       -  1   - 1/2/2001   
 2       -  1   - 2/3/2002
 3       -  2   -
 4       -  3   -
 32      -  1   - 5/3/2011
 34      -  1   - 1/2/2013

我们想要识别所有 type=1 的 table_ids 具有相同的可用日期值,但我们想要区分 type=2 和 type=3 的空值。

我的解决方案:

  • 对于类型 2 填充未来日期 2016 年 8 月 9 日
  • 对于类型 3,填充固定日期值 99/99/9999

这是一个好方法吗?什么是一个好的技术,最佳解决方案来做到这一点?

我可以用值 99/99/9999 填充日期列(我相信我不能这样做,但我想确定一下)或者我可以使用哪些通常的虚拟值?

4

1 回答 1

0

如果您仅使用日期而忽略时间值,则可以在日期值的时间部分中编码有关类型的信息。

假设,我们有这个示例表:

create table my_table(
  table_id    number,
  type_field  number,
  date_field  date

);

基于它们,如果类型数少于一天内的秒数(< 86400),则可以将type_field数据编码为:date_field

select
  (
    nvl(date_field,to_date('00010101','yyyymmdd')) 
    + 
    type_field/24/60/60
  ) date_with_type_as_seconds
from 
  my_table;

选择数据后,您可以将日期部分与时间部分分开并获取两个字段:

with encoded_values as (
  select
    (
      nvl(date_field,to_date('00010101','yyyymmdd')) 
      + 
      type_field/24/60/60
    ) date_with_type_as_seconds
  from my_table
)
select
  (
    ( 
      to_number(date_with_type_as_seconds 
      - 
      trunc(date_with_type_as_seconds))
     )
       * 24 * 60 * 60
  )                    as type_field,

  decode( trunc(date_with_type_as_seconds),
    to_date('00010101','yyyymmdd'), null,
    trunc(date_with_type_as_seconds) 
  ) 
                       as date_field
from 
  encoded_values;

SQLFiddle test

于 2013-09-25T21:58:12.757 回答