Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL DATEDIFF结果与Excel在小时数上的差异_Sql_Sql Server_Excel - Fatal编程技术网

SQL DATEDIFF结果与Excel在小时数上的差异

SQL DATEDIFF结果与Excel在小时数上的差异,sql,sql-server,excel,Sql,Sql Server,Excel,我们一直在努力寻找解决这个问题的方法 我们正在远离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)

我们一直在努力寻找解决这个问题的方法

我们正在远离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
以小时为单位的结果为:25.266667

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

给出结果:26.350000

有人对如何解决这一矛盾有想法吗

提前感谢你


朱莉安娜检查你的输入。你的逻辑是正确的,尽管可以简化。为清晰起见,请在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

我确实得到了同样的价值,但我无法重现这个问题。我也没有得到不同。此外,在您的情况下,不需要将值强制转换为SMALLDATETIME。不强制转换就检查它:DATEDIFF(秒,CONVERT(DATETIME,Service_-Date,103)+CONVERT(DATETIME,Service_-Time,103),CONVERT(DATETIME,Change_-Date,103)+CONVERT(DATETIME,Change_-Time,103))/3600.0请检查
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