基于yyyy / mm / dd AM / PM的日期差异

时间:2014-02-22 00:49:40

标签: php sql sql-server datediff

我正在使用设备预订系统并需要计算租用设备的天数,因此我可以将其乘以每次预订的每日总费用,然后将查询中所有预订的总费用加起来。设备提取日期和返回日期存储在单独的字段中,如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字段是每天的租金成本。我需要一种方法来准确计算消费者的收费天数。我感谢任何有关该主题的帮助。这是我的第一个问题,并为我所犯的任何错误道歉。

我正在努力完成的完成的屏幕可以在这里看到:

http://jeffreyalanscott.com/stack_overflow1.jpg

2 个答案:

答案 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