我陷入了这个问题。以下部分" 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'
);
答案 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并在导入期间执行一次类型转换。
还有另一个问题:如果有任何代表无效日期的字符串,您的查询将会失败。