22,209
社区成员
发帖
与我相关
我的任务
分享
SELECT * FROM date_in WHERE
(date_in.time_start NOT BETWEEN (SELECT MIN(date_out.time_start) FROM date_out)AND(SELECT MAX(date_out.time_start) FROM date_out))
AND
(date_in.time_end NOT BETWEEN (SELECT MIN(date_out.time_end) FROM date_out)AND(SELECT MAX(date_out.time_end) FROM date_out))
刚学了几天数据库,纯粹练手 嘿嘿
CREATE TABLE #ta([Start] smalldatetime,[End] smalldatetime)
INSERT INTO #ta
SELECT '2014-03-13','2014-03-13' UNION ALL
SELECT '2014-03-14','2014-03-14' UNION ALL
SELECT '2014-03-15','2014-03-15' UNION ALL
SELECT '2014-03-16','2014-03-16' UNION ALL
SELECT '2014-03-25','2014-03-25' UNION ALL
SELECT '2014-03-26','2014-03-26' UNION ALL
SELECT '2014-03-27','2014-03-27' UNION ALL
CREATE TABLE #ta([Start] smalldatetime,[End] smalldatetime)
CREATE TABLE #tb([HolidayStart] smalldatetime,[HolidayEnd] smalldatetime)
INSERT INTO #tb
SELECT '2014-03-15','2014-03-17' UNION ALL
SELECT '2014-03-24','2014-03-26'
;
MERGE #ta AS target
USING(SELECT HolidayStart,HolidayEnd FROM #tb) AS source(HolidayStart,HolidayEnd )
ON target.[Start]>=source.HolidayStart and target.[End]<=source.HolidayEnd
WHEN matched then delete;
SELECT * FROM #ta
MERGE #ta AS target
USING(SELECT HolidayStart,HolidayEnd FROM #tb) AS source(HolidayStart,HolidayEnd )
ON target.[Start]>=source.HolidayStart and target.[End]<=source.HolidayEnd
WHEN matched then delete;
SELECT * FROM #ta
WITH CTE AS
(
SELECT xj_begintime,
case when CONVERT(varchar(12) , xj_begintime, 112 )=CONVERT(varchar(12) , xj_endtime, 112 ) then xj_endtime
else CAST ( CONVERT(varchar(12) , dateadd(dd,1,xj_begintime), 111 )+' 00:00:00' as datetime) end as stat_day,
xj_endtime
FROM Table_XJ
union all
select a.stat_day,
case when CONVERT(varchar(12) , a.stat_day , 112 )=CONVERT(varchar(12) , b.xj_endtime, 112 ) then b.xj_endtime
else CAST ( CONVERT(varchar(12) , DATEADD (dd,1,a.stat_day ), 111 )+' 00:00:00' as datetime) end as stat_day,
a.xj_endtime
from cte a join Table_XJ b on a.xj_endtime =b.xj_endtime
where a.stat_day <b.xj_endtime
) select * from Table_DK
left join
(
select xj_begintime as xj_time
from CTE
union
select xj_endtime from Table_XJ as xj_time
) t on Table_DK.dk_begintime=t.xj_time where xj_time is null
;WITH CTE AS
(
SELECT xj_begintime,
case when CONVERT(varchar(12) , xj_begintime, 112 )=CONVERT(varchar(12) , xj_endtime, 112 ) then xj_endtime
else CAST ( CONVERT(varchar(12) , dateadd(dd,1,xj_begintime), 111 )+' 00:00:00' as datetime) end as stat_day,
xj_endtime
FROM Table_XJ
union all
select a.stat_day,
case when CONVERT(varchar(12) , a.stat_day , 112 )=CONVERT(varchar(12) , b.xj_endtime, 112 ) then b.xj_endtime
else CAST ( CONVERT(varchar(12) , DATEADD (dd,1,a.stat_day ), 111 )+' 00:00:00' as datetime) end as stat_day,
a.xj_endtime
from cte a join Table_XJ b on a.xj_endtime =b.xj_endtime
where a.stat_day <b.xj_endtime
)
select xj_begintime as xj_time
from CTE
union
select xj_endtime from Table_XJ as xj_time