我正在比较有关错误的两个日期列,一列是已解决的错误,一列是已关闭的错误。我想要两者中的较大者,但是有空值(当错误尚未解决或关闭时)。如何在忽略null值的同时取两者中的较大者?我看到了其他解决方案,但您必须在代码中指定日期,但我无法在数据集中指定日期,因为日期过长。日期格式为mm / dd / yy hh:mm:ss PM / AM
(GREATEST(dtResolved , dtClosed))
答案 0 :(得分:1)
如何?
GREATEST(COALESCE(dtResolved , dtClosed), COALESCE(dtClosed, dtResolved))
使用此逻辑,如果两个日期都不都是NULL
,那么您将获得两者中的较大者。如果一个是NULL
,那么您将获得非NULL
的日期。
编辑:
日期格式为mm / dd / yy hh:mm:ss PM / AM
这听起来像是将日期存储为文本,这总是一个坏主意。要使上述建议生效,您必须先将文本转换为日期:
STR_TO_DATE('02/28/2014 09:30:05 AM', '%m/%d/%Y %r')
答案 1 :(得分:0)
这是另一个例子:
GREATEST(COALESCE(UNIX_TIMESTAMP(STR_TO_DATE(dtResolved, '%m/%d/%Y %r')), 0), COALESCE(UNIX_TIMESTAMP(STR_TO_DATE(dtClosed, '%m/%d/%Y %r')), 0))
此代码将为您提供更大的时间戳记。原因是GREATEST
函数将以字符串形式返回您的日期,在年份,月份或日期之间没有任何空格或斜杠。因此,时间戳是防止这种情况的好方法。
仅在dtResolved
和dtClosed
为null
的情况下进行比较,请使用COALESCE
和0
而不是两个值。这将防止您的查询崩溃。它将返回0
。
就像Tim告诉您的那样,将字符串日期转换为date对象并不是一个坏主意。对于存在的多种功能,始终最好使用日期对象。