【问题标题】:Oracle SQL Select date range when dates are in varchar2当日期在 varchar2 中时,Oracle SQL 选择日期范围
【发布时间】:2020-07-23 10:08:49
【问题描述】:

当日期为 varchar2 dd/mm/yyyy 时,应如何选择日期范围?

当我使用时:

SELECT * FROM invoice
WHERE data_doc >= '01/07/2020'
AND data_doc <= '19/07/2020'

返回 data_doc 所在的值,即 = 02/03/2020

【问题讨论】:

标签: sql oracle select


【解决方案1】:

当您比较字符串(本例中为varchar2)时,您按字典顺序比较它们。一种方法是将这些字符串转换为实际日期:

SELECT * 
FROM   invoice
WHERE  TO_DATE(data_doc, 'DD/MM/YYYY') >= TO_DATE('01/07/2020', 'DD/MM/YYYY') AND
       TO_DATE(data_doc, 'DD/MM/YYYY') <= TO_DATE('19/07/2020', 'DD/MM/YYYY') 

【讨论】:

  • 是的,但 Mureinik 忘记了日期中的“/”;)
【解决方案2】:

在任何地方使用 TO_DATE 转换

SELECT * FROM invoice
WHERE TO_DATE(data_doc,'DD/MM/YYYY') >= TO_DATE('01/07/2020','DD/MM/YYYY') 
  AND TO_DATE(data_doc,'DD/MM/YYYY') <= TO_DATE('19/07/2020','DD/MM/YYYY') 

【讨论】:

    【解决方案3】:

    您(唉)需要将该列转换为日期。然后可以直接对日期进行比较:

    WHERE TO_DATE(data_doc, 'DD/MM/YYYY') >= DATE '2020-07-01' AND
          TO_DATE(date_doc, 'DD/MM/YYYY') <= DATE '2020-07-17'
    

    为了提高性能,Oracle 支持表达式索引。因此,您可以在TO_DATE(data_doc, 'DD/MM/YYYY') 上创建索引。

    也就是说,您应该修复您的数据模型,以便将日期正确地存储为日期。

    因为您正在比较同一月份的日期 - 并且仅出于这个原因 - 您可以通过要求数据在同一月份来调整比较:

    WHERE data_doc >= '01/07/2020' AND
          data_doc <= '19/07/2020' AND
          data_doc LIKE '__/07/2020'
    

    不过,我强烈建议您修复数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多