解决方案 »
- sql 2008无法启动调试 求解释
- 拆分一个中间是分号的字符串写入数据库,怎么拆分。多谢!
- 如何查询数据库中指定表的所占的磁盘空间
- select datediff(s,lastupdate,getdate()) from tcompanysupplier 出现"两个 datetime 列的差别导致了运行时溢出。"错误.
- 关于INSERT的触发器
- SQL server 安装问题
- 求助CSDN大师 字段拆分问题 谢谢
- MSSQL2000中如何实现每12小时自动更新同一表中从一字段复制数据到另一字段?
- SQL语句请教高手
- 求个sql
- 请问 SQL server2000 的运行快捷键是什么 ???
- MSSQL客户端访问数据库报错:SQL错误(17)
SELECT start_time,ROW_NUMBER()OVER(ORDER BY start_time)RN
FROM TB T1
WHERE NOT EXISTS(
SELECT 1 FROM TB T2 WHERE T1.A1<>T2.A1
AND T1.start_time>T2.start_time AND T1.start_time<=T2.stop_time
)
GROUP BY start_time
)
,stop AS(
SELECT stop_time,ROW_NUMBER()OVER(ORDER BY stop_time)RN
FROM TB T1
WHERE NOT EXISTS(
SELECT 1 FROM TB T2 WHERE T1.A1<>T2.A1
AND T1.stop_time>=T2.start_time AND T1.stop_time<T2.stop_time
)
GROUP BY stop_time
)
SELECT SUM(DATEDIFF(DAY,start_time,stop_time))SUMDAY
FROM start JOIN stop ON start.RN = stop.RN
--这边是MSSQL的语法
--你在这边转化成你ORACLE的语法
这样的语法出来的结果是 RESIDENCE_NO TS
1 000337713002 7
而如果我直接用最大值最小值去计算出来的数据是
RESIDENCE_NO TS
1 000337713002 11
我实际手工去算的话,也是11天。原始数据如下
start_time stop_time
1 000337713002 2014-12-24 10:57 2015-1-3 10:06
1 000337713002 2014-12-23 16:05 2014-12-24 10:33
start_time stop_time
1 000337713002 2014-12-24 10:57 2015-1-3 10:06
1 000337713002 2014-12-23 16:05 2014-12-24 10:33
这个是11天那这个
start_time stop_time
1 000337713002 2014-12-25 10:57 2015-1-3 10:06
1 000337713002 2014-12-23 16:05 2014-12-24 10:33
这个也是11天吗
start_time stop_time
1 000337713002 2014-12-25 10:57 2015-1-3 10:06
1 000337713002 2014-12-23 16:05 2014-12-24 10:33
这个也是11天吗
对这个也是11天。
select
distinct start.residence_no residence_no,
sum(trunc(stop.stop_time)-trunc(start.start_time)) DAY
from
(
SELECT distinct residence_no,start_time,ROW_NUMBER()OVER(ORDER BY start_time)RN
FROM TB T1
WHERE NOT EXISTS(
SELECT 1 FROM TB T2 WHERE T1.A1<>T2.A1
AND T1.start_time>T2.start_time AND T1.start_time<=T2.stop_time
)
GROUP BY start_time,residence_no
) start
,(
SELECT distinct residence_no,stop_time,ROW_NUMBER()OVER(ORDER BY stop_time)RN
FROM TB T1
WHERE NOT EXISTS(
SELECT 1 FROM TB T2 WHERE T1.A1<>T2.A1
AND T1.stop_time>=T2.start_time AND T1.stop_time<T2.stop_time
)
GROUP BY stop_time,residence_no
)stop where start.RN = stop.RN and start.residence_no=stop.residence_no
group by start.residence_no
----这其中的residence_no为' 000337713002 '
SUM(DATEDIFF(DAY,start_time,stop_time))DAY
--sum(trunc(stop.stop_time)-trunc(start.start_time)) DAY
from
(
SELECT residence_no,start_time,ROW_NUMBER()OVER(PARTITION BY residence_no ORDER BY start_time)RN
FROM TB T1
WHERE NOT EXISTS(
SELECT 1 FROM TB T2 WHERE T1.residence_no=T2.residence_no AND T1.A1<>T2.A1
AND CONVERT(VARCHAR(8),T1.start_time,112)>CONVERT(VARCHAR(8),T2.start_time,112)
AND CONVERT(VARCHAR(8),T1.start_time,112)<=CONVERT(VARCHAR(8),T2.stop_time,112)+1
--ORACLE应该是这样的
--AND TO_CHAR(T1.start_time,'YYYYMMDD')>TO_CHAR(T2.start_time,'YYYYMMDD')
--AND TO_CHAR(T1.start_time,'YYYYMMDD')<=TO_CHAR(T2.stop_time+1,'YYYYMMDD')
)
GROUP BY start_time,residence_no
) start
,(
SELECT residence_no,stop_time,ROW_NUMBER()OVER(PARTITION BY residence_no ORDER BY stop_time)RN
FROM TB T1
WHERE NOT EXISTS(
SELECT 1 FROM TB T2 WHERE T1.residence_no=T2.residence_no AND T1.A1<>T2.A1
AND CONVERT(VARCHAR(8),T1.stop_time,112)>=CONVERT(VARCHAR(8),T2.start_time,112)-1
AND CONVERT(VARCHAR(8),T1.stop_time,112)<CONVERT(VARCHAR(8),T2.stop_time,112)
--ORACLE应该是这样的
--AND TO_CHAR(T1.stop_time,'YYYYMMDD')>=TO_CHAR(T2.start_time-1,'YYYYMMDD')
--AND TO_CHAR(T1.stop_time,'YYYYMMDD')<TO_CHAR(T2.stop_time,'YYYYMMDD')
)
GROUP BY stop_time,residence_no
)stop
where start.RN=stop.RN and start.residence_no=stop.residence_no
group by start.residence_no你试下,相应的地方自己注释和反注释下