如何获取期限数据不在预定生效日期内的记录

时间:2018-10-16 17:09:02

标签: sql sql-server

我有带以下数据的表test_member。

meme_ck mepe_eff_dt             mepe_term_dt
1       6/1/2010 12:00:00 AM    12/31/9999 12:00:00 AM
1       5/1/2010 12:00:00 AM    6/1/2010 12:00:00 AM
1       3/1/2010 12:00:00 AM    4/1/2010 12:00:00 AM
1       5/1/2010 12:00:00 AM    6/1/2010 12:00:00 AM
1       2/1/2010 12:00:00 AM    3/1/2010 12:00:00 AM
1       1/1/2010 12:00:00 AM    2/1/2010 12:00:00 AM
2       2/10/2010 12:00:00 AM   3/10/2010 12:00:00 AM
2       1/10/2010 12:00:00 AM   2/10/2010 12:00:00 AM
2       6/10/2010 12:00:00 AM   12/31/9999 12:00:00 AM
2       5/10/2010 12:00:00 AM   6/10/2010 12:00:00 AM
2       3/10/2010 12:00:00 AM   4/10/2010 12:00:00 AM
3       1/1/2011 12:00:00 AM    12/31/9999 12:00:00 AM
3       10/1/2010 12:00:00 AM   11/1/2010 12:00:00 AM
3       11/1/2010 12:00:00 AM   12/1/2010 12:00:00 AM.

对于每个meme_ckmepe_term_dt将是下一个meme_ck mepe_eff_dt,但是meme_ck中只有很少的mepe_eff_dt没有较早的mepe_term_dt,我需要使用sql query找出那些记录,专业知识请帮忙! !!!!

1 个答案:

答案 0 :(得分:0)

编辑:

在评论中澄清了,OP正在寻找起始日期前有间隔而不是后有间隔的记录。仍然可以通过反联接来实现,只需在JOIN上进行另一种操作即可。

SELECT t1.meme_ck, t1.mepe_eff_dt, t1.mepe_term_dt
FROM t1
LEFT OUTER JOIN t1 t2 ON t1.meme_ck = t2.meme_ck 
    AND t1.mepe_eff_dt = t2.mepe_term_dt
WHERE t2.meme_ck IS NULL

ORDER BY t1.meme_ck, t1.mepe_eff_dt, t1.mepe_term_dt

这还包括meme_ck的第一条记录,因为根据定义,它们的开始日期之前没有结束日期。如果最后的日期之间有间隔,这还将包括最后的日期。

https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=24166fd317b911b27a8582c099126972

演示使用字符串中的日期值与实际使用日期对象之间的区别。由于有数据,将返回有效的行,但是您可以看到以这种格式的字符串“ date”可能以不同的顺序排序。当处理应该代表日期的内容时,我总是发现 MUCH 更好地处理实际日期。 (注意:当我将它们设置为SQL日期类型时,我也更改了日期格式,因为dbfiddle.uk使用DD-MM-YYYY而不是美国常见的MM-DD-YYYY样式。因此,您再次可以看到SQL如何表示不同于字符串的日期。另外请注意,作为实际日期,它将空字符串转换为1900-01-01的纪元日期。)

================================================ ========

原始: 使用反联接可以解决此问题,该联接应注意“日期”是实际日期数据类型还是它们是varchars。

SELECT t1.meme_ck, t1.mepe_eff_dt, t1.mepe_term_dt 
FROM t1
LEFT JOIN t1 t2 ON t1.meme_ck = t2.meme_ck 
    AND t1.mepe_term_dt = t2.mepe_eff_dt
WHERE t2.meme_ck IS NULL
    AND t1.mepe_term_dt <> '12/31/9999 12:00:00 AM' 
        /* Or whatever your ending date is. */
ORDER BY t1.meme_ck, t1.mepe_eff_dt, t1.mepe_term_dt

ORDER BY并不是必须的。我只是出于说明目的将其包括在内。

 meme_ck | mepe_eff_dt           | mepe_term_dt         
 ------: | :-------------------- | :--------------------
       1 | 3/1/2010 12:00:00 AM  | 4/1/2010 12:00:00 AM 
       2 | 3/10/2010 12:00:00 AM | 4/10/2010 12:00:00 AM
       3 | 11/1/2010 12:00:00 AM | 12/1/2010 12:00:00 AM

https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=9b27da9988bc60a56ae86c9f093d3346