2016-08-23 141 views
-1

Vertica DB有一个名为created_ts的专栏,其记录如3/15/2016,03/15/2016,2016/03/15和15/03/2016。我想过滤不符合DD/MM/yyyy格式的记录。如何在Vertica DB中查找无效的日期记录?

+0

你能告诉我们你当前的查询吗? –

+0

我有Teradata DB的查询。其中有SYS_CALENDAR.CALENDAR表,以便我可以加入该表并获得输出。以下是我的查询选项(*) - (SELECT COUNT(*) FROM DP_VEDW_NGN.STG_SITE_CATALYST A LEFT OUTER JOIN SYS_CALENDAR.CALENDAR on(CALENDAR_DATE(FORMAT'YYYY-MM-DD')(CHAR(10))) = A.date_time AND A.date_time IS NOT NULL)作为Invalid_Date'date_time'AS COLUMN_NAME from DP_VEDW_NGN.STG_SITE_CATALYST – Midhun

回答

0

这应该标识大多数不是有效的DD/MM/YYYY日期的字符串,但是如果您想要清除4月31日(或2月29日)闰年)。

select * from my_table 
where not (translate(created_ts,'','9999999999')='99/99/9999' 
      and split_part(created_ts,'/',1) between '01' and '31' 
      and split_part(created_ts,'/',2) between '01' and '12') 
+0

该查询不允许我翻译,因为created_ts在其中有时间戳。'split_part(created_ts,'/' ,2)在'01'和'12'之间)'不返回任何值。但在'01'和'31'之间'split_part(created_ts,'/',2)的同一行)''。不幸的是我没有任何无效的月份记录。 – Midhun

+0

我修改了查询,如'select * from (SELECT DATE_PART('month',created_ts)||'/'|| DATE_PART('day',created_ts)||'/'|| DATE_PART('year',created_ts )作为created_ts ,来自ROYALTY_STG.STG_DL_FILES)A 其中'01'和'12'之间的Not(split_part(created_ts,'/',1)和0121之间的split_part(created_ts,'/',2) 31' 和'2000'和'9999'之间的split_part(created_ts,'/',3))。月份部分不会获取01和12之间的任何记录。 – Midhun