检查可以为空的日期值是否正确

Jos*_*ien 5 sql t-sql sql-server-2008

我有一个包含日期的数据集,想要检查日期顺序是否正确.

RecordID   Date1        Date2        Date3        Date4
1          2011-05-10   2011-08-16   NULL         2011-11-22
2          NULL         2012-02-03   2012-02-27   2012-03-05
3          2011-05-30   2011-05-11   2011-08-17   2011-09-15
4          2011-05-30   NULL         NULL         NULL
Run Code Online (Sandbox Code Playgroud)

在提供日期的所有情况下,这应该成立:Date1 <Date2 <Date3 <Date4.当记录包含某些日期的NULL值时,应检查非NULL的日期.所以这就是我想要的结果:

RecordID   Date1        Date2        Date3        Date4        CheckDates
1          2011-05-10   2011-08-16   NULL         2011-11-22   correct
2          NULL         2012-02-03   2012-02-27   2012-03-05   correct
3          2011-05-30   2011-05-11   2011-08-17   2011-09-15   incorrect
4          2011-05-30   NULL         NULL         NULL         correct
Run Code Online (Sandbox Code Playgroud)

我为此写了一篇广泛的CASE声明,但必须有一个更优雅的解决方案:

CASE
  WHEN Date1 IS NULL AND Date2 IS NULL AND Date3 IS NULL AND Date4 IS NULL THEN 'correct'
  WHEN Date1 IS NULL AND Date2 IS NULL AND Date3 IS NULL AND Date4 IS NOT NULL THEN 'correct'
  WHEN Date1 IS NULL AND Date2 IS NULL AND Date3 IS NOT NULL AND Date4 IS NULL THEN 'correct'
  WHEN Date1 IS NULL AND Date2 IS NULL AND Date3 IS NOT NULL AND Date4 IS NOT NULL AND Date3 < Date4 THEN 'correct'
  ...
  ELSE 'incorrect'
END
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑:
我正在寻找一个解决方案,允许更多'日期'列比我上面给出的第一个例子中的三列(我在现实世界中有四个问题,并将其更改为三个以简化问题,但似乎我已经失去了这种简化的重要特征).更新了四列的示例.

njr*_*101 7

您可以使用ISNULLCOALESCE跳过空值.如果缺少日期,只需将其替换为始终通过检查的日期:

CASE
  WHEN (ISNULL(Date1, '01/01/1900') < COALESCE(Date2, Date3, Date4, '01/01/3000'))
   AND (ISNULL(Date2, '01/01/1900') < COALESCE(Date3, Date4, '01/01/3000'))
   AND (ISNULL(Date3, '01/01/1900') < COALESCE(Date4, '01/01/3000'))
  THEN 'correct'
  ELSE 'incorrect'
END
Run Code Online (Sandbox Code Playgroud)

这假设你的"真实"日期永远不会超出风暴1900 - 3000当然; 还有下一个等待发生的千年虫;)

编辑:编辑处理四个字段

  • @Josien:编辑了4个领域.主要的是,表达式线性增长而不是原始版本需要检查所有空字段组合 - 这将呈指数级增长.如果您正在寻找可以使用可变数量字段的内容,那么这通常超出了"普通"SQL的范围,并转向某种字符串构建和EXEC. (3认同)