日期列的虚拟值

时间:2013-09-25 20:38:32

标签: sql oracle oracle11g

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

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

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

我的解决方案:

  • for type-2填充未来日期8/9/2016
  • for type-3填充固定日期值99/99/9999

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

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

1 个答案:

答案 0 :(得分: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