比较日期列

时间:2015-04-10 21:52:15

标签: teradata

我需要检索service_date大于prod_date的行。 prod_date的数据类型是VARCHAR(10)(例如2/20/2014),service_date的数据类型是DATE(YYYYMMDD)。如果我使用&#34查询service_date;请从service_date =' 20140201'"中选择service_date,结果显示" 2/1/2014"在结果网格中。但是,当我将service_date转换为varchar以与prod_date进行比较时,它在下面的查询中不起作用。它会拉出所有行,而不是那些具有更大service_date的行。

SELECT P.PROD_ID, P.PROD_DESC, S.PROD_ID, S.SERVICE_LOC
FROM PRODUCT P
INNER JOIN SERVICE S
WHERE P.PROD_ID = S.PROD_ID
AND CAST(S.SERVICE_DATE AS VARCHAR(10)) >= P.PROD_DATE

2 个答案:

答案 0 :(得分:1)

我建议您使用日期排序而不是字符串/ varchar排序,如果可能的话,为了简单起见,因为它[可能]更接近您感兴趣的内容并且不太可能混淆

例如

'01/02/2014' >= '04/01/2013'  -- if these are dates or cast to dates

'01/02/2014' <  '04/01/2013'  -- if these are strings

因此,为了简单起见,将PROD_DATE转换为比较这两个字段的日期是有意义的:

SELECT P.PROD_ID, P.PROD_DESC, S.PROD_ID, S.SERVICE_LOC
FROM PRODUCT P
INNER JOIN SERVICE S
WHERE P.PROD_ID = S.PROD_ID
AND S.SERVICE_DATE >= cast(P.PROD_DATE as date format 'DD/MM/YYYY')
;

如果对prod_dates质量的任何疑问为有效日期,可以先检查所有日期的转换(在上述运行/调整之前)

答案 1 :(得分:0)

这不是100%的错误证明,因为您的日期是字符,可能有意外的值。它确实显示了如何将前导值0附加到月份值并将其转换为根据/在{{1}的第二个位置中PROD_DATE的位置确定为单个数字的日期给定行的值。

SELECT CASE WHEN POSITION('/' IN TRIM(P.PROD_DATE)) = 2
            THEN CAST('0'|| TRIM(P.PROD_DATE) AS CHAR(10)) AS DATE FORMAT 'MM/DD/YYYY')
            ELSE CAST(P.PROD_DATE AS DATE FORMAT 'MM/DD/YYYY')
       END AS PROD_DATE_
  FROM PRODUCT P;