Varchar m / d / yyyy到yyyy / mm / dd sql

时间:2015-08-17 20:29:27

标签: sql date format teradata varchar

我有一个文件以m / d / yyyy或m / dd / yyyy格式输入数据,具体取决于日期值是否为2位数(例如2015年4月1日或2015年4月14日)。我需要将其转换为格式为yyyy / mm / dd的日期(例如2015/04/01或2015/04/14)。我尝试了多种方式但每次都收到错误“无效日期”。请帮忙。

我尝试过的事情:

cast((CASE WHEN CHAR_LENGTH(RSA_dt) <10 THEN 0 || TRIM(RSA_dt) end) AS DATE) 
CAST( CAST( RSA_dt AS DATE FORMAT 'DD-MMM-YY') AS DATE FORMAT 'YYYY-MM-DD')
cast(RSA_dt as date format 'YYYY-MM-DD')

7 个答案:

答案 0 :(得分:1)

您使用哪种工具进行加载? 加载此数据的最简单方法是将该列定义为TPT作业中的VARDATE:

VARDATE(10) FORMATIN 'MM/DD/YY' FORMATOUT 'YYYY-MM-DD' 

否则你遇到了问题,因为Teradata的CAST不喜欢单日数字/月。从TD14开始Oracle的TO_DATE,它仍然不像一个月的数字,但至少可以容忍一位数的日子:

TO_DATE(CASE 
          WHEN RSA_dt LIKE '_/%' 
          THEN '0' || RSA_dt
          ELSE RSA_dt
        END
        ,'mm/dd/yyyy')

答案 1 :(得分:1)

这将适用于TPT。

"document.getElementsByTagName(\'body\')[0].style.fontFamily = \"Impact,Charcoal,sans-serif\";"

答案 2 :(得分:0)

看起来您提供的是想要的格式,而不是您提供的格式。试试这个:

cast(RSA_dt as date format 'MM/DD/YYYY')

答案 3 :(得分:0)

如果您没有使用TPT,那么您就会陷入一些可怕的子串游戏。

SELECT
 SUBSTR(chardate,INSTR(chardate,'/',1,2)+ 1,4) AS theYear,
'00' || SUBSTR(chardate,1,INSTR(chardate,'1',1,1)-2) AS theMonth,
'00' || SUBSTR(chardate,INSTR(chardate,'/',1,1)+ 1,INSTR(chardate,'/',1,2)  - INSTR(chardate,'/',1,1)-1) AS theDate,
CAST (theYear || '-' || SUBSTRING(theMonth,LENGTH(theMonth) -1,2) || '-' || SUBSTR(theDate,LENGTH(thedate)-1,2) AS DATE) AS ItsADate

    FROM
    <yourtable>

真的很丑,但它应该有用。

答案 4 :(得分:0)

这应该有用。

Select '1/2/2014' as date1,
TO_CHAR(TO_DATE (
case    
    when strtok(date1, '/', 2) between 1 and 9 then strtok(date1,'/', 3)||'/0'||strtok(date1, '/', 1)||'/'||strtok(date1,'/', 2)
    else  strtok(date1, '/', 3)||'/'||strtok(date1, '/', 1)||'/'||strtok(date1,'/', 2)
end , 'YYYY/MM/DD'), 'YYYY/MM/DD') as "YYYY/MM/DD"

答案 5 :(得分:0)

这是另一种解决方案。它使用正则表达式将前导零添加到任何一位数字,然后使用标准转换将其转换为使用现有格式的日期,然后再转换回标准格式。我列举了几个例子:

SELECT CAST(CAST(TD_SYSFNLIB.REGEXP_REPLACE('4/1/2015','(?<!\d)(\d)(?!\d)','0\1',1,0,'i') AS DATE FORMAT 'MM/DD/YYYY') AS DATE FORMAT 'YYYY-MM-DD');

SELECT CAST(CAST(TD_SYSFNLIB.REGEXP_REPLACE('4/14/2015','(?<!\d)(\d)(?!\d)','0\1',1,0,'i') AS DATE FORMAT 'MM/DD/YYYY') AS DATE FORMAT 'YYYY-MM-DD');

SELECT CAST(CAST(TD_SYSFNLIB.REGEXP_REPLACE('12/1/2015','(?<!\d)(\d)(?!\d)','0\1',1,0,'i') AS DATE FORMAT 'MM/DD/YYYY') AS DATE FORMAT 'YYYY-MM-DD');

答案 6 :(得分:0)

这将起作用,尽管效果不佳。专门将M / D / YYYY转换为YYYYMMDD

select substr(YOURDATE,-4,4) || 
substr('00'||SUBSTR(YOURDATE,1,to_number(regexp_instr(YOURDATE,'\/'))-1),-2,2) ||
case when substr(YOURDATE,2,1) = '/' then
    case when substr(YOURDATE,4,1) = '/' then
        '0' || substr(YOURDATE,3,1)
    else substr(YOURDATE,3,2)
    end
else case when substr(YOURDATE,5,1) = '/' then
        '0' || substr(YOURDATE,4,1)
    else substr(YOURDATE,4,2)
    end
end as NEWDATE                                                                                              
from YOURTABLE