sql - 检查可为空的日期值以获得正确的顺序

标签 sql sql-server-2008 tsql

我有一个带日期的数据集,想检查日期顺序是否正确。

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

在提供日期的所有情况下,这应该保持: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

我为此写了一个广泛的 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

有任何想法吗?

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

最佳答案

您可以使用 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

这假设您的“真实”日期永远不会超出 1900 - 3000 的范围;下一个千年虫正在等待发生;)

编辑:编辑以处理四个字段

关于sql - 检查可为空的日期值以获得正确的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10500755/

相关文章:

xml - 如何在sql查询中分解提到的XML

c# - Membership.DeleteUser() 不删除用户

sql - 用默认值填充非空列之间的空列

sql - 旋转 1300 万条记录时,tempDB 在 SQL Server 中已满,旋转需要超过 28 小时

php - SELECT * FROM city WHERE city LIKE '%value% %value%' ;

sql - to_char的格式间隔

mysql - 使用 if 条件过滤 SQL 查询

mysql - 注册客户和访客结帐的数据库架构

sql-server - 删除表、重新创建表并重新索引是否比在 SQL Server 中简单地删除表中的所有行更快?

时间卡列的 SQL 日期(动态)