比较日期列

Compare date columns

我需要检索 service_date 大于 prod_date 的行。 prod_date 的数据类型是 VARCHAR(10)(例如 2/20/2014),service_date 的数据类型是 DATE (YYYYMMDD)。如果我使用 "select service_date from service where 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

为了简单起见,我建议您尽可能使用日期排序而不是 string/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 质量有任何疑问,因为有效日期可以先检查所有日期的转换(在上述 running/adjusting 之前)

这不是 100% 的错误证明,因为您的日期是字符并且可能有意外的值。它确实显示了如何将前导 0 附加到月份值并将其转换为根据 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;