200分大赠送!急!!(200分)

  • 主题发起人 主题发起人 冰冰
  • 开始时间 开始时间

冰冰

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个数据库mdb,zksz表如下:
sjd integer 时间顺序
sstart time 起时间
eend time 止时间
discount text 折扣
flag text 是否折扣
sjd sstart eend discount flag
1 13:00:00 19:00:00 3 1
2 19:00:00 20:00:00 5 1
3 20:00:00 01:00:00 6 0 //0表示不打折
4 01:00:00 02:00:00 5 1
5 02:00:00 13:00:00 3 1
怎样判断起止时间落在一个时间段内和跨时段,并算出跨越几个时间段的总金额,希望给出代码
 
问题都没有说清楚。
你的表中什么地方出现过金额?

一个时间点,怎么会跨时段?
 
13点开始,02点以后结束,经过了五个折扣时间段,金额是传入的一个变量,算出这五个时间段的
消费总额
 
還是不明白, 判斷起始時間在一個時間段內和跨時段, 金額是個傳入變量, 更加不明白,
傳入個金額求消費總額???, 你還是說說你的需求吧.
 
是一个包房计时计费系统,每个包房有自己的单价,计费时,有上述几个优惠时段,每个优惠
时段的折扣不一样,客人消费的时间是在这几个优惠时段内,计算出客人消费的时间和金额
 
呵呵,楼上两位不会吧, 应该说得很清楚了啊
列出数据的那个表表示时间段内的折扣额,13点到19点打3折,19点到20点为5折
假如你14点进入20点离开,就是14点到19点5个小时的价格是3折,最后一小时打5折了。[^]

其实算法很简单,输入是两个时间,一个为开始包房时间B,一个为结束时间E
先判断B在那个区间段:
select * from zksz where B > sstart and B < eend;
计算第一个区间客人应付的款:
select decode(flag, 1, discount, 10) * 单价 * (eend - B) from zksz where sjid = 上面得到的sjid;
这里decode是Oracle中的函数,当flag为1时返回discount字段的值(即打折)否则返回10(不打折)
在Access里应该支持case吧,你用case改写就行了。或者先用sql取得这个值存在变量里面。
再判断E在哪个区间:
select * from zksz where E > sstart and E < eend;
同样算得这个区间内该付的款。
最后根据两个sjid判断跨了几个区间并计算款项:
select sum(decode(flag, 1, discount, 10) * 单价 * (eend - sstart)) from zksz
where sjid > sjid1 and sjid < sjid2;
其中sjid1为第一个SQL取得的,sjid2为结束区间的sjid
搞而定之!
 
其实在看到你的答案之前我就解决了,但我不知道能用一个函数就能解决
不过你的答案我还没试,反正解决思路一样,但还是将分送上
 
后退
顶部