空值的两个不同列的较大值

时间:2018-06-29 13:52:36

标签: mysql sql

我正在比较有关错误的两个日期列,一列是已解决的错误,一列是已关闭的错误。我想要两者中的较大者,但是有空值(当错误尚未解决或关闭时)。如何在忽略null值的同时取两​​者中的较大者?我看到了其他解决方案,但您必须在代码中指定日期,但我无法在数据集中指定日期,因为日期过长。日期格式为mm / dd / yy hh:mm:ss PM / AM

(GREATEST(dtResolved , dtClosed))

2 个答案:

答案 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函数将以字符串形式返回您的日期,在年份,月份或日期之间没有任何空格或斜杠。因此,时间戳是防止这种情况的好方法。

仅在dtResolveddtClosednull的情况下进行比较,请使用COALESCE0而不是两个值。这将防止您的查询崩溃。它将返回0

就像Tim告诉您的那样,将字符串日期转换为date对象并不是一个坏主意。对于存在的多种功能,始终最好使用日期对象。