求教,同列日期转区间日期

cedar_xu 2011-12-09 09:38:54
表单数据:

主持人 会议类型 日期 开始时间 结束时间
王二 人事会议 2011-12-01 08:00 12:00
王二 人事会议 2011-12-02 08:00 12:00
王二 人事会议 2011-12-03 14:00 18:00
王二 人事会议 2011-12-04 08:00 12:00
王二 财务会议 2011-12-06 08:00 12:00
王二 财务会议 2011-12-07 08:00 12:00
王二 财务会议 2011-12-08 14:00 18:00
王二 财务会议 2011-12-10 08:00 12:00
王二 人事会议 2011-12-11 08:00 12:00
王二 人事会议 2011-12-12 08:00 12:00
王二 人事会议 2011-12-18 14:00 18:00
王二 人事会议 2011-12-19 08:00 12:00

通过SQL语句,转成如下表单:

主持人 会议类型 开始日期 结束日期 天数
王二 人事会议 2011-12-01 2011-12-04 4
王二 财务会议 2011-12-06 2011-12-08 3
王二 财务会议 2011-12-10 2011-12-10 1
王二 人事会议 2011-12-11 2011-12-12 2
王二 人事会议 2011-12-18 2011-12-19 2


想了好几天,没有想出一个好的方法,特来求助,谢谢大家!



...全文
92 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cedar_xu 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
SQL code

----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2011-12-09 09:45:17
-- Version:
-- Microsoft SQL Server 2008 R2 (RTM)……
[/Quote]

感谢,经过不断调整 测试,已经得到想要的结果,而且还发现一些问题,ROW_NUMBER()over 这个2000还用不了,哎。谢谢。
cedar_xu 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
SQL code
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2011-12-09 09:45:17
-- Version:
-- Microsoft SQL Server 2008 R2 (RTM) -……
[/Quote]
学习一下,谢谢 但是跨月 又有问题了
黄_瓜 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 beirut 的回复:]

SQL code
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([主持人] varchar(4),[会议类型] varchar(8),[日期] datetime,[开始时间] datetime,[结束时间] sql_variant)
insert [tb]
select '……
[/Quote]
错了。。。。。。。。。
黄_瓜 2011-12-09
  • 打赏
  • 举报
回复
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([主持人] varchar(4),[会议类型] varchar(8),[日期] datetime,[开始时间] datetime,[结束时间] sql_variant)
insert [tb]
select '王二','人事会议','2011-12-01',' 08:00','12:00' union all
select '王二','人事会议','2011-12-02',' 08:00','12:00' union all
select '王二','人事会议','2011-12-03',' 14:00','18:00' union all
select '王二','人事会议','2011-12-04 ','08:00','12:00' union all
select '王二','财务会议','2011-12-06',' 08:00','12:00' union all
select '王二','财务会议','2011-12-07',' 08:00','12:00' union all
select '王二','财务会议','2011-12-08',' 14:00','18:00' union all
select '王二','财务会议','2011-12-10',' 08:00','12:00' union all
select '王二','人事会议','2011-12-11',' 08:00','12:00' union all
select '王二','人事会议','2011-12-12',' 08:00','12:00' union all
select '王二','人事会议','2011-12-18',' 14:00','18:00' union all
select '王二','人事会议','2011-12-19',' 08:00','12:00'

select a.[主持人],a.[会议类型],[开始时间]=a.[日期]+1,
[结束时间]=(
select min([日期]) from tb aa
where [主持人]=a.[主持人] and [会议类型] =a.[会议类型] and [日期]>a.[日期]
and not exists(
select * from tb where [主持人]=aa.[主持人] and [会议类型] =aa.[会议类型]and [日期]=aa.[日期]-1))
-1
from(
select [主持人],[会议类型],[日期] from tb
union all --为每组编号补充查询起始编号是否缺号的辅助记录
select [主持人],[会议类型],min([日期]) from tb group by [主持人],[会议类型]
)a,(select [主持人],[会议类型],[日期]=max([日期]) from tb group by [主持人],[会议类型])b
where a.[主持人]=b.[主持人] and a.[会议类型]=b.[会议类型] and a.[日期]<b.[日期] --过滤掉每组数据中,编号最大的记录
and not exists(
select * from tb where [主持人]=a.[主持人] and [会议类型]=a.[会议类型] and [日期]=a.[日期]+1)
order by a.[主持人],[开始时间]

/*
主持人 会议类型 开始时间 结束时间
---- -------- ----------------------- -----------------------
王二 人事会议 2011-12-05 00:00:00.000 2011-12-10 00:00:00.000
王二 财务会议 2011-12-09 00:00:00.000 2011-12-09 00:00:00.000
王二 人事会议 2011-12-13 00:00:00.000 2011-12-17 00:00:00.000

(3 行受影响)



*/
--小F-- 2011-12-09
  • 打赏
  • 举报
回复
哦 忘记了天数了 自己去减一下。
--小F-- 2011-12-09
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2011-12-09 09:45:17
-- Version:
-- Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86)
-- Apr 22 2011 11:57:00
-- Copyright (c) Microsoft Corporation
-- Enterprise Evaluation Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([主持人] varchar(4),[会议类型] varchar(8),[日期] datetime,[开始时间]varchar(10),[结束时间] varchar(10))
insert [tb]
select '王二','人事会议','2011-12-01' ,'08:00','12:00' union all
select '王二','人事会议','2011-12-02' ,'08:00','12:00' union all
select '王二','人事会议','2011-12-03' ,'14:00','18:00' union all
select '王二','人事会议','2011-12-04' ,'08:00','12:00' union all
select '王二','财务会议','2011-12-06' ,'08:00','12:00' union all
select '王二','财务会议','2011-12-07' ,'08:00','12:00' union all
select '王二','财务会议','2011-12-08' ,'14:00','18:00' union all
select '王二','财务会议','2011-12-10' ,'08:00','12:00' union all
select '王二','人事会议','2011-12-11' ,'08:00','12:00' union all
select '王二','人事会议','2011-12-12' ,'08:00','12:00' union all
select '王二','人事会议','2011-12-18' ,'14:00','18:00' union all
select '王二','人事会议','2011-12-19' ,'08:00','12:00'
--------------开始查询--------------------------

select
a.主持人,a.会议类型,
b.日期 as 开始日期,
case when a.日期=b.日期 then b.日期 else a.日期 end as 结束日期
from
( select px=ROW_NUMBER()over(order by GETDATE()),* from tb t where not exists(select 1 from tb where DATEDIFF(dd,t.日期,日期)=1 and 主持人=t.主持人 and 会议类型=t.会议类型))a
join
(select px=ROW_NUMBER()over(order by GETDATE()),* from tb t where not exists(select 1 from tb where DATEDIFF(dd,日期,t.日期)=1 and 主持人=t.主持人 and 会议类型=t.会议类型))b
on
a.px=b.px

----------------结果----------------------------
/* 主持人 会议类型 开始日期 结束日期
---- -------- ----------------------- -----------------------
王二 人事会议 2011-12-01 00:00:00.000 2011-12-04 00:00:00.000
王二 财务会议 2011-12-06 00:00:00.000 2011-12-08 00:00:00.000
王二 财务会议 2011-12-10 00:00:00.000 2011-12-10 00:00:00.000
王二 人事会议 2011-12-11 00:00:00.000 2011-12-12 00:00:00.000
王二 人事会议 2011-12-18 00:00:00.000 2011-12-19 00:00:00.000

(5 行受影响)


*/
pengxuan 2011-12-09
  • 打赏
  • 举报
回复
不明白为什么设计表的时候不给一次会议加一个Id进行识别,这样就能很容易查出开始和结束了
--小F-- 2011-12-09
  • 打赏
  • 举报
回复
典型的求断号

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧