【问题标题】:how to extract date format from a string oracle如何从字符串 oracle 中提取日期格式
【发布时间】:2017-04-26 12:06:46
【问题描述】:

我试图找出有多少人的身份证从数据库中过期,因为数据具有这种格式:

CI+OT+1x78xx+POL.SLATINA+29-08-2003+14-07-2013

BI+GV+591xxx+MUN CAMPIA TURZII+03-02-1997+

所以它被 + 五次分隔(其中一些永远不会过期)

我已经这样做了,但它不起作用......

select 
set_act_id_1,
to_number(sysdate-to_date(substr(set_act_id_1,instr(set_act_id_1,'+',1,5)+1,length(set_act_id_1)),'DD-MM-YYYY')) 
from STAGE.CUSTOMERS 
where set_act_id_1 is not null 
group by set_act_id_1 
having sysdate-to_date(substr(set_act_id_1,instr(set_act_id_1,'+',1,5)+1,length(set_act_id_1)),'DD-MM-YYYY')<0;

【问题讨论】:

  • 1) 您使用的是哪个版本的 Oracle? 2)所以第一个过期,因为14-07-2013 小于当前日期,第二个永远不会过期,因为+ 之后的第五个位置为空?
  • toad for oracle 12.10

标签: oracle date


【解决方案1】:
SELECT set_act_id_1,
       TO_DATE( REGEXP_SUBSTR( set_act_id_1, '[^+]+', 1, 6 ), 'DD-MM-YYYY' )
FROM   STAGE.CUSTOMERS 
WHERE  set_act_id_1 is not null

或者

SELECT set_act_id_1,
       TO_DATE( SUBSTR( set_act_id_1, INSTR( set_act_id_1, '+', 1, 5 ) + 1 ), 'DD-MM-YYYY' )
FROM   STAGE.CUSTOMERS 
WHERE  set_act_id_1 is not null

更新

SELECT CASE
         WHEN REGEXP_LIKE( expiry_date, '^\d{1,2}[ \/-](JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[ \/-]\d{4}$', 'i' )
         THEN TO_DATE( expiry_date, 'dd mon yyyy' )
         WHEN REGEXP_LIKE( expiry_date, '^\d{1,2}[ \/-](JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[ \/-]\d{2}$', 'i' )
         THEN TO_DATE( expiry_date, 'dd mon yy' )
         WHEN REGEXP_LIKE( expiry_date, '^(0?[1-9]|[12]\d|3[01])[ \/-](0?[1-9]|1[0-2])[ \/-]\d{4}$' )
         THEN TO_DATE( expiry_date, 'dd mm yyyy' )
         WHEN REGEXP_LIKE( expiry_date, '^(0?[1-9]|1[0-2])[ \/-](0?[1-9]|[12]\d|3[01])[ \/-]\d{4}$' )
         THEN TO_DATE( expiry_date, 'mm dd yyyy' )
         WHEN REGEXP_LIKE( expiry_date, '^(0?[1-9]|[12]\d|3[01])[ \/-](0?[1-9]|1[0-2])[ \/-]\d{2}$' )
         THEN TO_DATE( expiry_date, 'dd mm yy' )
         WHEN REGEXP_LIKE( expiry_date, '^(0?[1-9]|1[0-2])[ \/-](0?[1-9]|[12]\d|3[01])[ \/-]\d{2}$' )
         THEN TO_DATE( expiry_date, 'mm dd yy' )
         ELSE NULL
       END AS expiry_date
FROM   (
  SELECT set_act_id_1,
         SUBSTR( set_act_id_1, INSTR( set_act_id_1, '+', 1, 5 ) + 1 ) As expiry_date
  FROM   STAGE.CUSTOMERS 
  WHERE  set_act_id_1 is not null
)

【讨论】:

  • 不,我有很多日期格式,例如 PT+ROU+0521xx942+ILFOV+23-Sep-2013+23-Sep-2018 或 CI+GG+37xx29+SPCJEP GIURGIU+09/DEC /2014+18/JUL/2074 或 CI+XH+9525xx+SPCLEP ORADEA+25-JUL-2014+06-DEC-2024 我想我需要一个有 4 个案例的函数,但我不知道如何开始.. .
  • 对于第二个查询:ORA-01858:在需要数字的地方发现了一个非数字字符
  • @AdyLacan 更新
  • ORA-01847: 日期必须介于 1 和最后一天之间 :(
  • @Seyran OP 似乎正在获取字符串的最后一个 + 分隔值 - 所以您需要做的就是找到第 5 个 + 字符的位置,然后获取所有跟随它的子字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多