我需要检索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
答案 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;