【问题标题】:Oracle SQL convert date format from DD-Mon-YY to YYYYMMOracle SQL 将日期格式从 DD-Mon-YY 转换为 YYYYMM
【发布时间】:2012-05-10 14:51:26
【问题描述】:

我要比较 2 个表中的日期,但问题是一个表的日期为 DD-Mon-YY 格式,另一个表的日期为 YYYYMM 格式。

我需要将它们都设为 YYYYMM 以进行比较。

我需要创建这样的东西:

SELECT * FROM offers 
WHERE offer_date = (SELECT to_date(create_date, 'YYYYMM') FROM customers where id = '12345678') 
AND offer_rate > 0

create_date 类似于 12-Mar-2006,offer_date 类似于 200605

有什么想法我需要调整这个查询吗??

【问题讨论】:

  • 您为什么遇到问题? offer_date 是 VARCHAR2(字符串)吗?
  • 日期没有这样的格式。如果你想要这种格式,你需要一个定义的字符串。那么,您是在寻找字符串(具有该格式)还是 DATETIME(没有格式)。因此,如果您的字段“具有不同的格式”,它们的实际数据类型是什么? DATETIMEs、VHARCHAR()s 等?
  • @phil - offer_date 是一个数字字段
  • @Dems - 除了上面的注释,create_date 是一个 DATE 字段
  • @Tom:如果您可以将这些日期列的数据类型转换为DATE,那就更好了。为什么使用NUMBER 作为日期列?

标签: sql oracle date-format to-date


【解决方案1】:

由于offer_date 是一个数字,并且其准确性低于您的真实日期,因此这可能有效...
- 将您的真实日期转换为格式字符串YYYYMM
- 将该值转换为 INT
- 比较你的结果offer_date

SELECT
  *
FROM
  offers
WHERE
    offer_date = (SELECT CAST(to_char(create_date, 'YYYYMM') AS INT) FROM customers where id = '12345678')
AND offer_rate > 0 

此外,通过对create_date 进行所有操作,您只需对一个值进行处理。

此外,如果您操纵了offer_date,您将无法在该字段上使用任何索引,因此强制扫描而不是搜索。

【讨论】:

    【解决方案2】:

    我错过了什么吗?您可以在比较中转换 offer_date:

    SELECT *
    FROM offers
    WHERE to_char(offer_date, 'YYYYMM') = (SELECT to_date(create_date, 'YYYYMM') FROM customers where id = '12345678') AND
          offer_rate > 0 
    

    【讨论】:

    • 我认为您已经接近解决方案。我说 create_date 是 DATE 格式,而 offer_date 是 NUMBER 格式会有帮助吗(这真的没什么帮助!)
    • WHERE to_char(offer_date, 'YYYYMM') = (SELECT to_char(create_date, 'YYYYMM') FR... 做到了...感谢您为我指明了正确的方向。
    • @Tom :请注意;在to_char() 中包装offer_date 将混淆该字段上的任何索引。相反,您可以在create_date 上执行所有处理,因为您只需为此查询执行一次,然后使用索引在offer_date 上进行索引查找。 [对标量常数进行操作几乎比操作正在搜索的数据更可取。]
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2016-04-29
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2022-01-25
    • 2021-12-31
    相关资源
    最近更新 更多