当日期在varchar2中时,oracle sql选择日期范围

brjng4g3  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(286)

当日期是varchar2 dd/mm/yyyy时,应该如何选择日期范围?
当我使用:

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

返回数据文档所在的值,即=02/03/2020

wfsdck30

wfsdck301#

比较字符串时( 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')
ercv8c1e

ercv8c1e2#

到处使用最新转换

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')
li9yvcax

li9yvcax3#

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

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'

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

相关问题