【问题标题】:SQL DATEDIFF result differ from Excel in fraction of hoursSQL DATEDIFF 结果在几小时内与 Excel 不同
【发布时间】:2019-04-30 01:53:04
【问题描述】:

一直在努力寻找解决此问题的方法。

我们正在远离 excel,并通过减去两个日期在几小时内将计算添加到 SQL 中。

问题是我们在 excel 中的结果与 SQL 不同。

这是我们在 excel 中的内容:

Change Date: 30/10/2018      
Change Time: 10:53

Service Date: 29/10/2018    
Service Time: 9:37      

The Formula in excel is: =((Change Date+Change Time)-(Service Date+Service Time))*24

Fraction of hours 的结果是:25.26666667

使用 DATEDIFF 导入 SQL 的相同数据(语法如下):

datediff(second,CAST(CAST(CONVERT(DATETIME,Service_Date,103) as smalldatetime) 
            + CAST(CONVERT(DATETIME,Service_Time,103) as smalldatetime) as smalldatetime),
            CAST(CAST(CONVERT(DATETIME,Change_Date,103) as smalldatetime) 
            + CAST(CONVERT(DATETIME,Change_Time,103) as smalldatetime) as smalldatetime)) /3600.0

给出结果:26.350000

有人知道如何解决这种差异吗?

提前致谢,

朱莉安娜

【问题讨论】:

  • 我确实得到了相同的值
  • 无法重现该问题。
  • 我也没有发现差异。此外,在您的情况下,您不需要将值转换为 SMALLDATETIME。检查它而不强制转换: DATEDIFF(SECOND, CONVERT(DATETIME, Service_Date, 103) + CONVERT(DATETIME, Service_Time, 103), CONVERT(DATETIME, Change_Date, 103) + CONVERT(DATETIME, Change_Time, 103)) / 3600.0
  • 请查看fiddle

标签: sql sql-server excel


【解决方案1】:

检查您的输入。您的逻辑是正确的,尽管可以简化。为了清楚起见,在 SSMS 中运行下面的代码示例。

declare @Service_Date varchar(max) = '30/10/2018'
declare @Service_Time varchar(max) = '10:53'

declare @Change_Date varchar(max) = '29/10/2018'
declare @Change_Time varchar(max) = '9:37'

--
-- Original 
--
select datediff(second,CAST(CAST(CONVERT(DATETIME,@Service_Date,103) as smalldatetime) 
            + CAST(CONVERT(DATETIME,@Service_Time,103) as smalldatetime) as smalldatetime),
            CAST(CAST(CONVERT(DATETIME,@Change_Date,103) as smalldatetime) 
            + CAST(CONVERT(DATETIME,@Change_Time,103) as smalldatetime) as smalldatetime)) /3600.0

--
-- Simplified - same result
--
select datediff(second,
    (CONVERT(smalldatetime,@Service_Date,103) + CONVERT(smalldatetime,@Service_Time,103)),
    (CONVERT(smalldatetime,@Change_Date,103) + CONVERT(smalldatetime,@Change_Time,103))) /3600.0

--
-- Simplfied - shows error is with inpuyts, not logic
--
set @Service_Time = '11:57'
set @Change_Time = '9:36'
select datediff(second,
    (CONVERT(smalldatetime,@Service_Date,103) + CONVERT(smalldatetime,@Service_Time,103)),
    (CONVERT(smalldatetime,@Change_Date,103) + CONVERT(smalldatetime,@Change_Time,103))) /3600.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多