postgres将char转换为datetime

时间:2015-08-20 15:14:53

标签: regex postgresql

好的家伙,我试图根据文本文件名转换char。使用正则表达式提取的名称。它完美无缺,直到8月21日这个日期。

const int width = 4;

void test(int&){}

int main() {
    test(width);
}

该代码将产生此错误。

select to_char(
to_date(
     regexp_replace(
        regexp_replace(
            regexp_replace(
                regexp_replace(
                    regexp_replace(
                        substr('UserAndMasterPlanPerAugust21st2015.txt',21),
                        '.txt',''),
                    'rd','-'),
                'th','-'),
            'nd','-'),
        'st','-'),
    'MonthDD-YYYY'),
'YYYYMMDD')::integer

**********错误**********

错误:“月”的无效值“Augu-21st” SQL状态:22007 细节:给定值与此字段的任何允许值都不匹配。

我希望这个日期的结果是     20150821

我已经知道问题出在'st'上,因为有两个'st',我只想尝试解决这个问题的最佳方法。

由于

2 个答案:

答案 0 :(得分:0)

我认为你可以使用另一个正则表达式,我建议你尝试使用这个来删除日期中的序数:

(?<=[0-9])(?:st|nd|rd|th)

example here

你只需要将它转移到postgres方言......

答案 1 :(得分:0)

我从字符串中删除了日期,然后将其转换为当前格式的日期。然后转换为具有所需格式的char。干杯!

select to_char(
 to_date(
      substring('UserAndMasterPlanPerAugust21st2015.txt'
                 from 21 for length('UserAndMasterPlanPerAugust21st2015.txt')-24
               ), 'MonthDDthYYYY'), 'YYYYMMDD');

-24的目的是因为我只想向右移动日期所在的空格数。如果总长度为n,我从21开始,这意味着我还剩下n-20个字符。我想删除.txt,所以移动4个空格。因此我想从21 - >开始到字符串-24的长度。