我们必须修改日期列,以便相应地过滤数据:
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,它们是空值。
我的解决方案:
这是一个好方法吗?这样做有什么好的技术,最佳解决方案?
我可以使用值99/99/9999填充日期列(我相信我不能这样做,但我想确定)或者我可以使用的常用虚拟值是什么?
答案 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 强>