Если вы используете FULL OUTER JOIN
, вы можете объединить список дат, а затем просто выбрать записи, в которых одна или другая имеет значение NULL:
SELECT COALESCE(i.in_gentime, o.out_gentime) -- pick first non-null value
FROM in_time_temp i
FULL OUTER JOIN out_time_temp o
ON CAST(CONVERT(varchar(8), i.in_gentime, 112) AS datetime) =
CAST(CONVERT(varchar(8), o.out_gentime, 112) AS datetime)
AND i.cardnumber = o.cardnumber
WHERE (i.in_gentime is null or o.out_gentime IS NULL)
AND (i.cardnumber = 'MCL1750' OR o.cardnumber = 'MCL1750')
Обновление .Натан, вот полный тестовый код, я не уверен, почему вы не получаете результаты, но при запуске я получаю 4 записи:
CREATE TABLE in_time_temp
(
in_gentime datetime,
cardnumber nvarchar(50)
)
insert into in_time_temp values('2011-10-11 08:06:00.000', 'MCL1750')
insert into in_time_temp values('2011-10-12 08:35:00.000', 'MCL1750')
insert into in_time_temp values('2011-10-13 08:21:00.000', 'MCL1750')
insert into in_time_temp values('2011-10-15 08:21:00.000', 'MCL1750')
insert into in_time_temp values('2011-10-16 08:21:00.000', 'MCL1750')
insert into in_time_temp values('2011-10-17 08:21:00.000', 'MCL1750')
CREATE TABLE out_time_temp
(
out_gentime datetime,
cardnumber nvarchar(50)
)
insert into out_time_temp values('2011-10-11 22:02:00.000', 'MCL1750')
insert into out_time_temp values('2011-10-12 21:14:00.000', 'MCL1750')
insert into out_time_temp values('2011-10-14 21:59:00.000', 'MCL1750')
insert into out_time_temp values('2011-10-15 21:59:00.000', 'MCL1750')
insert into out_time_temp values('2011-10-16 21:59:00.000', 'MCL1750')
insert into out_time_temp values('2011-10-17 21:59:00.000', 'MCL1750')
insert into out_time_temp values('2011-10-18 21:59:00.000', 'MCL1750')
insert into out_time_temp values('2011-10-19 21:59:00.000', 'MCL1750')
SELECT COALESCE(i.in_gentime, o.out_gentime) -- pick first non-null value
FROM in_time_temp i
FULL OUTER JOIN out_time_temp o
ON CAST(CONVERT(varchar(8), i.in_gentime, 112) AS datetime) =
CAST(CONVERT(varchar(8), o.out_gentime, 112) AS datetime)
AND i.cardnumber = o.cardnumber
WHERE (i.in_gentime is null or o.out_gentime IS NULL)
AND (i.cardnumber = 'MCL1750' OR o.cardnumber = 'MCL1750')
И вывод:
2011-10-13 08:21:00.000
2011-10-14 21:59:00.000
2011-10-18 21:59:00.000
2011-10-19 21:59:00.000