【问题标题】:Date difference based on yyyy/mm/dd AM/PM in SQLSQL 中基于 yyyy/mm/dd AM/PM 的日期差异
【发布时间】:2014-02-22 00:49:39
【问题描述】:

我正在使用设备预订系统,需要计算设备的租用天数,以便将其乘以每次预订的每日总成本,然后将查询中所有预订的总成本相加。设备取件日期和返回日期存储在单独的字段中,如 yyyy/mm/dd 00:00:00.000(没有条目包含除 00:00:00.000 以外的时间),还有取件 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

【问题讨论】:

  • 我们可以知道这个AM/PM 字段的名称吗?
  • RETURNAMPM, PICKUPAMPM 是这两个字段,如果我能提供任何其他信息,请告诉我。谢谢
  • 总体而言,此查询将非常困难。您是否研究过 MySQL IF() 构造? stackoverflow.com/questions/5951157/…
  • 这在 SQL 服务器环境中是否同样有效?
  • 我的错,应该阅读标签。我可以检查

标签: php sql sql-server datediff


【解决方案1】:

我建议使用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 部分是因为该函数舍入了部分天数。

【讨论】:

  • 感谢 Mike 的回复,但是每个取件和返回日期在数据库中的格式如下:YYYY-MM-DD 00:00:00.000 没有一个单独的时间包含时间:(修改所有取件和返回日期值,以便如果 PICKUPAMPM/RETURNAMPM 是 PM 时间,它将日期格式化为 YYYY-MM-DD 23:59:59.000 和 AM 可以是 YYYY-MM-DD 08:00:00.000或类似的东西?
【解决方案2】:

您可以使用 case 语句根据返回时间的小时数增加天数。您可以根据 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           

【讨论】:

  • 我的问题开始不好了... TOTAL 字段是每天预订费用的 $ 值,并且没有附加任何日期的时间数据库中的条目。这样做的目的是计算在 res 时所有相关预订的实际成本的总和,如果客户不遵守这一点,它就超出了我的控制范围。 PAIDOUT 字段用于显示预订的佣金是否已支付,这使我达到了真正的最终目标,即计算资源上应付的总佣金。尚未支付。
猜你喜欢
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多