varchar和dd-mmm-yy格式的日期

时间:2014-09-05 06:28:27

标签: sql date teradata

我陷入了这个问题。以下部分" TRANSMITTED_DATE LIKE' 17-JUL-14'"是硬编码的。我想把它变成一个普遍的。

我想做这样的事情

WHERE CAST(TRANSMITTED_DATE  AS DATE FORMAT 'DD-MMM-YY') BETWEEN 
        CAST(CURRENT_DATE AS DATE FORMAT 'DD-MMM-YY') 
        AND CAST(CURRENT_DATE AS DATE FORMAT 'DD-MMM-YY')-7

,即从上次对该表运行此查询时的最近七天记录。

但是,表中的传输日期是VARCHAR字段,格式类似于31-OCT-13,即DD-MMM-YY。

请帮我查询。

SELECT 
         MLI_MDL_NUMBER as DOCUMENTUM_MLI
        ,TRANSMITTAL_NUMBER
        ,PROJECT_ID
        ,TRANSMITTED_DATE
    FROM GEEDW_PLP_BULK_V.CDR_DOCUMENTUM_TRSMTL
    WHERE
    ( TRANSMITTED_DATE LIKE '17-JUL-14'   OR
     TRANSMITTED_DATE LIKE '18-JUL-14'   OR
     TRANSMITTED_DATE LIKE '19-JUL-14'   OR
     TRANSMITTED_DATE LIKE '20-JUL-14'   OR
     TRANSMITTED_DATE LIKE '21-JUL-14'   OR
     TRANSMITTED_DATE LIKE '22-JUL-14'   OR
     TRANSMITTED_DATE LIKE '23-JUL-14'   OR
     TRANSMITTED_DATE LIKE '24-JUL-14'   OR
     TRANSMITTED_DATE LIKE '25-JUL-14'
      );

1 个答案:

答案 0 :(得分:1)

根据全局系统设置(dbscontrol中的Century Break)或Teradata版本,这可能很容易。

如果您使用的是TD14,则可以使用Oracle的TO_DATE:

WHERE TO_DATE(TRANSMITTED_DATE, 'dd-mon-yy')
      BETWEEN CURRENT_DATE - 7 AND CURRENT_DATE

否则请尝试以下查询并检查返回的内容:

SELECT CAST('17-JUL-14' AS DATE FORMAT 'DD-MMM-YY')

如果是2014-07-17,您只需使用

即可
WHERE CAST(TRANSMITTED_DATE AS DATE FORMAT 'DD-MMM-YY') 
      BETWEEN CURRENT_DATE - 7 AND CURRENT_DATE

如果它是1914-07-17

WHERE CAST(SUBSTRING(TRANSMITTED_DATE FROM 1 FOR 7) || '20' ||
           SUBSTRING(TRANSMITTED_DATE FROM 8) AS DATE FORMAT 'DD-MMM-YY')
      BETWEEN CURRENT_DATE - 7 AND CURRENT_DATE

当然,所有这些都很糟糕,因为每一行都需要从字符串转换为日期,这是一个很大的开销,你将松散现有的统计数据。

如果这是一个大表,并且您需要经常运行该查询,则应尝试将数据类型更改为DATE并在导入期间执行一次类型转换。

还有另一个问题:如果有任何代表无效日期的字符串,您的查询将会失败。