【问题标题】:Fetching the records which are having all time stamp columns获取具有所有时间戳列的记录
【发布时间】:2014-11-20 06:04:53
【问题描述】:

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

我正在使用以下查询来获取在最终日期和(最终日期 - 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 的链接,用于演示该问题。

【问题讨论】:

  • @NicholasKrasnov 我尝试使用它 ~ SELECT A.ROW_ID, A.PROD_NAME FROM PROD A, PROD_REL B WHERE A.ROW_ID = B.PAR_ROW_ID AND A.CREATED_DT BETWEEN (B.FINAL_DATE - 30) AND B.FINAL_DATE; ~ 它给了我未知的命令(B.FINAL_DATE - 30)
  • 如果您提供表的结构以及每列的数据类型以及该(那些)表中的数据样本,将会很有帮助。否则,在不知道您在这些表中存储的内容以及存储方式的情况下,几乎不可能提供有用的答案。
  • 我希望月与日之间没有混淆:2014 年 11 月 12 日可能是 2014 年 12 月 11 日吗?
  • @NicholasKrasnov:我在这里提供了详细信息sqlfiddle.com/#!4/233023/1
  • Here we go。您将“日期”存储为日期,因此不需要 to_date() 函数。

标签: sql oracle date


【解决方案1】:

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

SQL Fiddle

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

【讨论】:

    【解决方案2】:

    由于您的数据类型都是日期,因此无需使用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
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      相关资源
      最近更新 更多