我正在使用设备预订系统并需要计算租用设备的天数,因此我可以将其乘以每次预订的每日总费用,然后将查询中所有预订的总费用加起来。设备提取日期和返回日期存储在单独的字段中,如yyyy / mm / dd 00:00:00.000(没有条目包含00:00:00.000以外的时间),还有用于提取AM / PM和返回AM的字段/下午。如果提取日期在PM中,那么那天不算作一天,如果返回日期在AM中那么它不算作一天。理想情况下,我想使用下面的查询来达到我的最终目标,但它计算的天数太多了。
SELECT
SUM(TOTAL*DATEDIFF(day,PICKUPDT,RETURNDT))
FROM
RENTAL
WHERE
AGENTCODE = '$AGENT' AND
PICKUPDT >= '06/01/2013' AND
RETURNDT <= '06/01/2014' AND
PAIDOUT = '1' )
以上内容嵌套在我正在运行的整个查询中。 TOTAL字段是每天的租金成本。我需要一种方法来准确计算消费者的收费天数。我感谢任何有关该主题的帮助。这是我的第一个问题,并为我所犯的任何错误道歉。
我正在努力完成的完成的屏幕可以在这里看到:
答案 0 :(得分:0)
我建议使用TIMESTAMPDIFF
代替DATEDIFF
,因为DATEDIFF
只考虑日期组件,而不考虑时间。
SELECT SUM(total * TIMESTAMPDIFF(DAY, pickupdt, returndt) + 1)
...
例如:
SELECT TIMESTAMPDIFF(DAY, '2014-01-01 08:00:00', '2014-01-02 12:00:00') + 1;
将产生一个整数值2,表示该项目的签出时间超过24小时。
+ 1
部分是因为该函数将部分天数向下舍入。
答案 1 :(得分:0)
您可以使用案例陈述根据返回时间的小时数递增日期计数。您可以根据Days:Hours:
实施更精细的规则declare @rental table (AgentCode varchar(100), PickUpDt datetime, ReturnDt datetime, PickupAmPm char(2), ReturnAmPm char(2));
insert into @rental
select '123', '2014-02-01', '2014-02-02', 'AM', 'PM' union all
select '456', '2014-02-01', '2014-02-02', 'AM', 'AM'
select AgentCode,
[total] = datediff(dd, PickupDt, ReturnDt) + case ReturnAmPm when 'AM' then 0 else 1 end
from @rental
返回:
AgentCode total
----------- -----------
123 2
456 1