2013-09-25 3 views
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 

Мы хотели бы, чтобы личность всех table_ids, которые имеют типа = 1 с теми же значениями дат, как в наличии, но мы хотим различать тип = 2 и type = 3, которые являются нулевыми значениями.

Мои решения:

  • для 2-го типа заселить будущие даты 8/9/2016
  • для типа 3-заселить фиксированного значения даты 99/99/9999

Является ли это хороший подход? Какое хорошее техническое, оптимальное решение для этого?

Могу ли я заполнить столбец даты значениями 99/99/9999 (я считаю, что не могу этого сделать, но я хочу быть уверенным) или каковы обычные значения фиктивных значений, которые я могу использовать для этого?

+1

Что это значит: «которые имеют тип = 1 с теми же значениями даты, как доступный»? Можете ли вы пояснить, почему «NULL» является проблематичным? –

+2

Используйте '02/02/9999' и' 03/03/9999' для type = 2 и type = 3 –

+0

table_ids (1,2,32,34) имеют значение type_column = 1 и их можно идентифицировать по значениям даты что они в настоящее время назначены. Моя проблема заключается в том, чтобы иметь возможность идентифицировать все три типа (введите значения столбца = 1,2,3), используя значения столбца даты. Таким образом, все допустимые даты могут быть идентифицированы как тип 1, все будущие даты, которые не равны 99/99/9999, могут быть идентифицированы как тип 2, другие могут быть типа 3 ... надеюсь, это полезно – avg998877

ответ

0

Если вы используете только даты и игнорируете значения времени, тогда можно кодировать информацию о типах во временной части значений даты.

Предположим, у нас есть этот пример таблицы:

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

); 

Основываясь на них можно закодировать type_field данные в date_field если число типов меньше количества секунд, в течение одного дня (< 86400):

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

Смежные вопросы