SQL SERVER中有关时间区间的查询问题

lxl 2005-04-10 01:37:52
表A有如下字段:
酒店顾客ID号、现住房间号,入住日期,离开日期(如果还没走的,就用GETDATE()作为离开日期)

表B中放置顾客的换房间记录(少数情况,但有记录),有如下字段:
酒店顾客ID号、原房间号,现房间号,换房日期

现要统计从某一天@frm 到 另一天@to 中,每个房间处于“有人入住”的状态的总天数

得到的查询格式应该如下:
处于“有人入住”的总天数 房间利用率
A 房 10 50%
B 房 20 100%
C 房 5 25%
D 房 15 75%

谢谢指教
...全文
488 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxl 2005-04-11
  • 打赏
  • 举报
回复
不是呀,如果一个人从4月1日到5日住2001房,6日换到了2002房,我的设计只保留一条记录,因为要用于调出顾客信息来进行顾客的记帐等操作,也就是把当前的2001换成2002,换房的信息只保留在换房记录表内
TechnoFantasy 2005-04-11
  • 打赏
  • 举报
回复
不会的吧,顾客换房了应该是产生一个新的记录吧。假设一个人从4月1日到5日住2001房,6日换到了2002房,那么就应该有至少两条记录。你只要在计算的时候group by 房间号应该就可以了啊。
luxuewei5214 2005-04-11
  • 打赏
  • 举报
回复
xuexi...
lxl 2005-04-11
  • 打赏
  • 举报
回复
如果是这样的话,那么就没法通过这一个表来获取某个房间一定时间的使用率了,因为在顾客换房以后原来的房间号在这个表里面已经没有表示了。估计你需要根据换房记录表的结构联立换房记录表。

是的,所说的表B正是此项数据
liuxingstar 2005-04-11
  • 打赏
  • 举报
回复
我认为,楼主要记录的主体是 客房,而楼主给出的两个表的主体是客人。相关性不是很大。
楼主是否考虑应该从新建立一个房间的表,每天为一个记录, 每年 或几年为一个周期。这样统计时
之间用时间就可以了。
节省很多步骤
mib3000 2005-04-11
  • 打赏
  • 举报
回复
up
TechnoFantasy 2005-04-11
  • 打赏
  • 举报
回复
如果是这样的话,那么就没法通过这一个表来获取某个房间一定时间的使用率了,因为在顾客换房以后原来的房间号在这个表里面已经没有表示了。估计你需要根据换房记录表的结构联立换房记录表。
max8max 2005-04-10
  • 打赏
  • 举报
回复
明白楼主的心情,帮顶
lxl 2005-04-10
  • 打赏
  • 举报
回复
还不是我要的结果,因为我要的是分房间的统计,而且顾客又不一定总在一个房间住(也就是说不能用当前所住的房间来考虑),还要把换房的情况考虑进去
lxl 2005-04-10
  • 打赏
  • 举报
回复
不过没关系,因为结果是负数,可以筛掉
lxl 2005-04-10
  • 打赏
  • 举报
回复
晕,发现
TechnoFantasy(冰儿马甲www.applevb.com) 有方法有一个缺陷,就是如果顾客的离开日期和入住日期的时间段,和 @frm 及 @to 之间根本没有任何重合,也会统计出结果
lxl 2005-04-10
  • 打赏
  • 举报
回复
多谢 TechnoFantasy(冰儿马甲www.applevb.com)
sum(GetDays(getSmallerDay(离开日期, @to)-getBiggerDay(入住日期, @from)))
这个方法很有效,但还不是我要的结果,因为我要的是分房间的统计,而且顾客又不一定总在一个房间住(也就是说不能用当前所住的房间来考虑),还要把换房的情况考虑进去
纯冰糖 2005-04-10
  • 打赏
  • 举报
回复
Study
todouwang 2005-04-10
  • 打赏
  • 举报
回复
先比较入住日期,@from
离开日期,@to的早晚关系
TechnoFantasy 2005-04-10
  • 打赏
  • 举报
回复
可以用一个过程来判断一下,把sum(GetDays(离开日期-入住日期))改成:

sum(GetDays(getSmallerDay(离开日期, @to)-getBiggerDay(入住日期, @from)))

getSmallerDay、getBiggerDay分别返回两个日期中比较早的和比较晚的一个。
lxl 2005-04-10
  • 打赏
  • 举报
回复
关注也会给分
lxl 2005-04-10
  • 打赏
  • 举报
回复
多谢楼上,但是忽略了一种情况,就是
sum(GetDays(离开日期-入住日期)) 并不一定等于 有人入住总天数
因为离开日期和入住日期,可能仅有一部分时间段,和 @frm 及 @to 之间重合,有时入住日期比
@frm要早,或入住日期比@to 要晚,这样统计出来的(离开日期-入住日期),就不是在@frm 到 另一天@to 天中所占的天数。
僵哥 2005-04-10
  • 打赏
  • 举报
回复
楼主这是流水帐的管理模式吧?

基本处理如下(未考虑换房):
----------------------------------
select 现住房间号,
sum(GetDays(离开日期-入住日期)) as 有人入住总天数,
cast(sum(GetDays(离开日期-入住日期))*100/GetDays(@to-@frm) as varchar 3)+'%' --包含性质的天数还应该+1
where 入住日期>=@frm and 离开日期<=@to
group by 现住房间号
----------------------------------
内容简介   本书全面介绍了SQL语句在数据库开发所用到的技术和技巧。全书分为23章,涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组统计、使用子查询、多表查询、高级查询、插入数据、更新和删除数据、创建、操纵数据库和表、使用视图、使用存储过程和函数、使用游标、使用触发器、事务处理、安全性控制、SQL高级特性、数据库对象查询、数据库安全与维护和嵌入式SQL等。全书共提供了463人个实例,每个实例都突出实用性,其大部分是程序开发者所需的有关问题的解决方案。   本书配有光盘,光盘提供了书所有实例的源代码。全部代码都经过精心调试,都可以正常运行。   本书适用于广大计算机爱好者和编程人员阅读,也可供大、专院校相关专业的师生学习参考。   目录   第1章 SQL语言基础   1.1 变量与常量   1.2 数据类型   1.3 复合语句   1.4 条件判断语句   1.5 循环语句   1.6 临时表   1.7 常用命令   第2章 常规数据查询   2.1 查询的基本结构   2.2 列的查询   2.3 列的计算   2.4 WHERE条件查询   2.5 区间查询   第3章 高级数据过滤   3.1 组合WHERE语句   3.2 IN运算符   3.3 NOT运算符   3.4 行查询   3.5 类型转换   3.6 进制转换   3.7 匹配查询   3.8 空值判断   第4章 字符串查询   第5章 日期查询   第6章 数据排序   第7章 聚合函数与分组统计   第8章 使用子查询   第9章 多表查询   第10章 高级查询   第11章 插入数据   第12章 更新和删除数据   第13章 创建、操纵数据库和表   第14章 使用视图   第15章 使用存储过程和函数   第16章 使用游标   第17章 使用触发器   第18章 事务处理   第19章 安全性控制   第20章 SQL高级特性   第21章 数据库对象查询   第22章 数据库安全与维护   第23章 嵌入式SQL   附录 SQL范例宝典实例适用范围
内容简介   本书全面介绍了SQL语句在数据库开发所用到的技术和技巧。全书分为23章,涉及到SQLServer2000、SQLServer2005、Access、Oracle10g、MySql5.0和Postgresql8.2等6种数据库语言,内容包括SQL语言基础、常规数据查询、高级数据过滤、字符串查询、日期函数、日期函数、数据排序、聚集函数与分组统计、使用子查询、多表查询、高级查询、插入数据、更新和删除数据、创建、操纵数据库和表、使用视图、使用存储过程和函数、使用游标、使用触发器、事务处理、安全性控制、SQL高级特性、数据库对象查询、数据库安全与维护和嵌入式SQL等。全书共提供了463人个实例,每个实例都突出实用性,其大部分是程序开发者所需的有关问题的解决方案。   本书配有光盘,光盘提供了书所有实例的源代码。全部代码都经过精心调试,都可以正常运行。   本书适用于广大计算机爱好者和编程人员阅读,也可供大、专院校相关专业的师生学习参考。   目录   第1章 SQL语言基础   1.1 变量与常量   1.2 数据类型   1.3 复合语句   1.4 条件判断语句   1.5 循环语句   1.6 临时表   1.7 常用命令   第2章 常规数据查询   2.1 查询的基本结构   2.2 列的查询   2.3 列的计算   2.4 WHERE条件查询   2.5 区间查询   第3章 高级数据过滤   3.1 组合WHERE语句   3.2 IN运算符   3.3 NOT运算符   3.4 行查询   3.5 类型转换   3.6 进制转换   3.7 匹配查询   3.8 空值判断   第4章 字符串查询   第5章 日期查询   第6章 数据排序   第7章 聚合函数与分组统计   第8章 使用子查询   第9章 多表查询   第10章 高级查询   第11章 插入数据   第12章 更新和删除数据   第13章 创建、操纵数据库和表   第14章 使用视图   第15章 使用存储过程和函数   第16章 使用游标   第17章 使用触发器   第18章 事务处理   第19章 安全性控制   第20章 SQL高级特性   第21章 数据库对象查询   第22章 数据库安全与维护   第23章 嵌入式SQL   附录 SQL范例宝典实例适用范围

2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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