Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon redshift 在红移中强制转换文本到最新日期_Amazon Redshift - Fatal编程技术网

Amazon redshift 在红移中强制转换文本到最新日期

Amazon redshift 在红移中强制转换文本到最新日期,amazon-redshift,Amazon Redshift,我已将日期保存为文本类型。有一些无效日期阻止我运行任何与日期相关的操作。例如 select case when deliver_date = '0000-00-00 00:00:00' then '2014-01-01' else deliver_date::date end as new_date, count(*) as cnt from some_table group by new_date Error in query: ERROR: Error converting text to

我已将日期保存为文本类型。有一些无效日期阻止我运行任何与日期相关的操作。例如

select case when deliver_date = '0000-00-00 00:00:00' then '2014-01-01' else deliver_date::date end as new_date, count(*) as cnt  from some_table group by new_date
Error in query: ERROR: Error converting text to date
我正在使用以下似乎有效的方法

select left(deliver_date,10) as new_date, count(*) as cnt  from sms_dlr group by new_date

但我想知道是否可以将此列转换为日期。

尝试删除
::date
部分:


尝试删除
::date
部分:


您需要区分有效日期值和无效日期值

一种解决方案是使用正则表达式—我将让您决定要做得多彻底,但这将广泛涵盖日期和日期时间值:

SELECT 
    CASE 
    WHEN 
        deliver_date SIMILAR TO '[0-9]{4}-[0-9]{2}-[0-9]{2}' 
        OR deliver_date SIMILAR TO '[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'  
    THEN TO_DATE(deliver_date, 'YYYY-MM-DD')
    ELSE TO_DATE('2014-01-01', 'YYYY-MM-DD') 
    END as new_date,
    COUNT(*) as cnt
FROM some_table
GROUP BY new_date

您需要区分有效日期值和无效日期值

一种解决方案是使用正则表达式—我将让您决定要做得多彻底,但这将广泛涵盖日期和日期时间值:

SELECT 
    CASE 
    WHEN 
        deliver_date SIMILAR TO '[0-9]{4}-[0-9]{2}-[0-9]{2}' 
        OR deliver_date SIMILAR TO '[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'  
    THEN TO_DATE(deliver_date, 'YYYY-MM-DD')
    ELSE TO_DATE('2014-01-01', 'YYYY-MM-DD') 
    END as new_date,
    COUNT(*) as cnt
FROM some_table
GROUP BY new_date

将日期存储为日期而不是文本的另一个很好的理由…当无效日期的值为“0000-00-00 00:00:00”(原始查询按预期工作)时,我无法再现错误。是否确定没有任何其他无效值,如“”?是。在同一日期列中有类似“abc”的文本。我的问题是如何将该文本转换为日期,例如“2014-01-01”将日期存储为日期而不是文本的另一个很好的理由…当无效日期的值为“0000-00-00 00:00:00”(您的原始查询按预期工作)时,我无法再现错误。是否确定没有任何其他无效值,如“”?是。在同一日期列中有类似“abc”的文本。我的问题是如何将该文本转换为日期,例如“2014-01-01”。如问题所述,如果您需要运行与日期相关的操作,此解决方案将不起作用。如问题所述,如果您需要运行与日期相关的操作,此解决方案将不起作用。这对我来说很有效,但有一点修改说明,我的日期数据是20170111,而不是
到日期(日期,'YYYY-MM-DD')
我需要
到日期(日期,'yyyyymmdd')
文档非常稀疏这对我来说是一个轻微的修改,我的日期数据是20170111,而不是
到日期(日期,'yyyyy-MM-DD')
我需要
到日期(日期,'yyyyyyymmdd'))
文档非常稀少