获取具有所有时间戳列的记录

时间:2014-11-19 20:37:46

标签: sql oracle date

我正在尝试获取具有所有时间戳列的记录。

我使用以下查询来获取在最终日期和(最终日期 - 30)天之间创建的产品,即在过去30天内创建的产品,这些产品属于最终日期'范围。

我的产品是在2014年10月30日创建的。对于相同的产品,发起日期为2014年11月12日。但是,当我使用以下查询时,它们不会被提取。

SELECT A.ROW_ID, 
       A.PROD_NAME 
  FROM PROD A, 
       PROD_REL B 
 WHERE A.ROW_ID = B.PAR_ROW_ID 
   AND TO_DATE(A.CREATED_DT,'YYYY-MM-DD') BETWEEN (TO_DATE(B.FINAL_DATE,'YYYY-MM-DD') - 30) 
                                              AND (TO_DATE(B.FINAL_DATE,'YYYY-MM-DD'));

所以,如果我错过了什么,你能告诉我吗?

以下是指示问题的SQLFiddle链接。

2 个答案:

答案 0 :(得分:1)

...或者只修复格式字符串TO_DATE(A.CREATED,'DD-MON-YYYY')

SQL Fiddle

将日期存储为DATE当然是一个很好的起点。

答案 1 :(得分:0)

由于您的数据类型都是日期,因此无需使用to_date。事实上,这是有害的,因为to_date不会将date作为参数。 Oracle必须使用会话的NLS_DATE_FORMAT进行从日期到字符串的隐式转换,该会话的to_date会传递到WHERE并使用您指定的显式格式掩码转换回日期。如果两次转换没有使用相同的格式掩码,则会发生不好的事情。

您的AND a.created_dt BETWEEN b.final_date - 30 AND b.final_date 条款只需要

{{1}}

如果我进行了更改,your SQLFiddle会返回两行