创建年份为 9999 的事实表

Posted

技术标签:

【中文标题】创建年份为 9999 的事实表【英文标题】:Creating fact table with year of 9999 【发布时间】:2015-02-13 02:32:48 【问题描述】:

我正在 oracle 中基于客户状态构建一个简单的事实表,其中客户的状态为“活动”和“丢失”,以及他们以该状态开始的日期和结束日期。

样本 3 行将是;

CustID | status | date_start | date_end   
---------------------------------------
  1    | active |   1/1/13   |  1/12/14  
  1    | lost   | 1/12/14    | 31/12/9999  
  2    |active  | 1/12/14    | 31/12/9999

在这里,cust 1 处于活动状态,然后丢失。当帐户状态为当前(截至今天)时,结束日期列是 31/12/9999。 Cust 2 从今天开始有效

我的问题是,我怎样才能把它带入事实表?

CREATE TABLE temp AS 
SELECT  CS.contract_status_id , to_char(ASH.Contract_Status_Start, 'DD/MM/YYYY') AS cust_status_start_date, to_char(ASH.CONTRACT_STATUS_END, 'DD/MM/YYYY') As cust_status_end_date
FROM account_status_history ASH,   
customer_status_dim CS
WHERE ASH.contract_status = CS.contract_status

事实表:

CREATE TABLE customer_status_fact AS
SELECT T.cust_status_start_date, T.cust_status_end_date, T.contract_status_id,
count(T.contract_status_id) AS TOTAL_ACCOUNTS
FROM temp T
GROUP BY T.cust_status_start_date, T.cust_status_end_date, T.contract_status_id

并对其进行测试;

select sum(F.TOTAL_ACCOUNTS), CS.contract_status_txt 
from customer_status_fact F, customer_status_dim CS

where F.contract_status_id = CS.contract_status_id
and F.cust_status_start_date <= sysdate 
and F.cust_status_end_date = '31/12/9999'
group by CS.contract_status_txt

我似乎无法让 oracle 识别 9999 年任何帮助表示感谢

【问题讨论】:

看这里***.com/questions/687510/… 【参考方案1】:

和 F.cust_status_end_date = '31/12/9999'

'31/12/9999' 不是 DATE,它是用单引号括起来的字符串。您必须使用 TO_DATE 将其显式转换为 DATE。

例如,

SQL> alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS';

Session altered.

SQL> SELECT to_date('31/12/9999 23:59:59','DD/MM/YYYY HH24:MI:SS') FROM dual;

TO_DATE('31/12/9999
-------------------
31/12/9999 23:59:59

SQL>

或,

SQL> SELECT to_date(5373484, 'J') + (1 - 1/24/60/60) FROM dual;

TO_DATE(5373484,'J'
-------------------
31/12/9999 23:59:59

SQL>

CREATE TABLE temp AS SELECT CS.contract_status_id , to_char(ASH.Contract_Status_Start, 'DD/MM/YYYY') AS cust_status_start_date, to_char(ASH.CONTRACT_STATUS_END, 'DD/MM/YYYY') 作为cust_status_end_date

为什么要创建一个将 DATE 转换为 STRING 的表?你应该让日期保持原样。您应该仅将 TO_CHAR 用于显示目的。对于任何日期计算,让日期保持为日期。

【讨论】:

是的,简直不敢相信使用 to_date 这么简单,很有意义

以上是关于创建年份为 9999 的事实表的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 jQuery 日期选择器的年份范围:1900 到当前年份,或 1900 到 9999

错误 ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且在使用 yyyymmdd 格式加载数据时不能为 0

Ssas 多维数据集向导不会为事实表列创建度量

在时间戳列上为使用年份函数的查询创建索引

基于事实表列创建新的计算度量

mysql 中,创建表时如何定义一个日期类型的字段