Oracle SQL中的最新日期

时间:2018-12-14 08:20:57

标签: sql oracle

嘿,我怎么能得到这句话的最新日期?

"SELECT MODEL, V_GODINA, DATUM_OSIGURANJA FROM EVP_V_KASKO_ZB EVP_1 WHERE 
EVP_1.OIB_OSIGURANIK = ? 
AND DATUM_OSIGURANJA = (SELECT MAX(DATUM_OSIGURANJA) FROM 
EVP_V_KASKO_ZB"
WHERE OIB_OSIGURANIK = EVP_1.OIB_OSIGURANIK)";

DATUM_OSIGURANJA是日期参数,结果不是最新日期,而是具有最大数值的日期。 该怎么解决?

20.06.2014
16.06.2018
11.06.2017
20.06.2015

这是要比较的行

这是我的结果

20.06.2015

2 个答案:

答案 0 :(得分:2)

看来DATUM_OSIGURANJAVARCHAR2列;是吗?如果是这样,则必须将其转换为DATE,然后选择其MAX值。像这样:

SELECT e.model, e.v_godina, e.datum_osiguranja
  FROM evp_v_kasko_zb e
 WHERE     e.oib_osiguranik = '99999999994'      --> guess what? A valid OIB :)
       AND TO_DATE (e.datum_osiguranja, 'dd.mm.yyyy') =
              (SELECT MAX (TO_DATE (e1.datum_osiguranja, 'dd.mm.yyyy'))
                 FROM evp_v_kasko_zb e1
                WHERE e1.oib_osiguranik = e.oib_osiguranik);

请注意,它将在DATUM_OSIGURANJA毁灭索引(如果有的话)(或者您应该创建基于函数的索引)。

正确的选项是更改列的数据类型。始终将日期存储在DATE数据类型列中。永远不要将其存储为VARCHAR2

答案 1 :(得分:1)

您的日期列是字符串类型。您需要将列转换为日期,然后再转换回varchar2

SELECT MODEL, V_GODINA, DATUM_OSIGURANJA FROM EVP_V_KASKO_ZB EVP_1 WHERE 
EVP_1.OIB_OSIGURANIK = ? 
AND DATUM_OSIGURANJA = (SELECT TO_CHAR(MAX(TO_DATE(DATUM_OSIGURANJA))) FROM 
EVP_V_KASKO_ZB"
WHERE OIB_OSIGURANIK = EVP_1.OIB_OSIGURANIK)