Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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操作数数据类型datetime/varchar对于sum运算符无效_Sql_Sql Server_Datetime_Sum_Intervals - Fatal编程技术网

SQL操作数数据类型datetime/varchar对于sum运算符无效

SQL操作数数据类型datetime/varchar对于sum运算符无效,sql,sql-server,datetime,sum,intervals,Sql,Sql Server,Datetime,Sum,Intervals,我试图从另一列中减去一列,然后对结果求和。然而,无论我做什么改变,我都会得到标题中提到的两个错误中的一个 从发布的所有其他问题中,我得出我的陈述应该是: SELECT SUM(EndTime-BeginTime) AS TotalTime FROM TimeRegister WHERE OrderNumber = 00000 AND Activity = 11111; 根据另一个主题中的建议,我将声明更改为: SELECT SUM(CONVERT(varchar(EndTime-BeginT

我试图从另一列中减去一列,然后对结果求和。然而,无论我做什么改变,我都会得到标题中提到的两个错误中的一个

从发布的所有其他问题中,我得出我的陈述应该是:

SELECT SUM(EndTime-BeginTime) AS TotalTime FROM TimeRegister 
WHERE OrderNumber = 00000 AND Activity = 11111;
根据另一个主题中的建议,我将声明更改为:

SELECT SUM(CONVERT(varchar(EndTime-BeginTime), 108)) AS TotalTime FROM TimeRegister 
WHERE OrderNumber = 00000 AND Activity = 11111;
但是,我仍然收到错误。 时间存储如下:

1-1-1900 7:30:00
谢谢你的建议


编辑1:哦,我在Excel中通过ODBC for SQL使用Microsoft查询,有点像:


编辑2:我更喜欢以HH:MM格式再次输出

问题是,当我将整个数据库复制到excel时,一切都正常。我可以减去这些列,然后求和。我只是不想每天都用手去做



我刚刚检查了SQL数据库,该列是日期/时间类型。

以下内容如何:

WITH totalTime AS (
  SELECT SUM(DATEDIFF(second,  EndTime, BeginTime)) as TimeInSecond
  FROM TimeRegister 
  WHERE OrderNumber = 00000 AND Activity = 11111;
)
SELECT RIGHT('0' + CAST(TimeinSecond / 3600 AS VARCHAR),2) + ':' +
  RIGHT('0' + CAST((TimeinSecond / 60) % 60 AS VARCHAR),2) + ':' +
  RIGHT('0' + CAST(TimeinSecond % 60 AS VARCHAR),2) AS TimeElapsed
FROM totalTime;

在这个解决方案中,时间在总计之前被转换成秒,然后被转换成HH:MM:SS。

下面的情况如何:

WITH totalTime AS (
  SELECT SUM(DATEDIFF(second,  EndTime, BeginTime)) as TimeInSecond
  FROM TimeRegister 
  WHERE OrderNumber = 00000 AND Activity = 11111;
)
SELECT RIGHT('0' + CAST(TimeinSecond / 3600 AS VARCHAR),2) + ':' +
  RIGHT('0' + CAST((TimeinSecond / 60) % 60 AS VARCHAR),2) + ':' +
  RIGHT('0' + CAST(TimeinSecond % 60 AS VARCHAR),2) AS TimeElapsed
FROM totalTime;

在这个解决方案中,时间在总计之前被转换成秒,然后转换成HH:MM:SS。

您似乎想要
datediff()


您似乎想要
datediff()


首先,试图通过转换为文本来解决日期或数字问题并不能解决任何问题,它会增加额外的问题,如转换失败或意外结果

SQL Server没有时间间隔类型。如果减去两个
datetime
值,则返回另一个
datetime
值,该值表示自1900-01-01以来的偏移量。以下查询:

select getdate() - dateadd(d,-1,getdate())
将返回:

1900-01-02 00:00:00.000
这是1900-01-01之后的一整天

datetime
值不能求和。SQL Server确实有一个
time
类型,但它只表示一天中的时间。即使
今天-昨天
有效,将其转换为
时间
也会返回
00:00

快速解决方案是使用
DATEDIFF
以所需的任何单位计算两个日期之间的差值-小时、分钟、秒等。请注意,
DATEDIFF
返回跨越的间隔边界数
DATEDIFF(DAY,…)
昨天晚上11点到今天凌晨1点之间将返回1,因为1天的边界已跨越

你可以用

SELECT sum(datediff(minute,EndTime,BeginTime)) AS TotalMinutes
FROM TimeRegister 
WHERE OrderNumber = 00000 AND Activity = 11111;
以分钟为单位计算差异,并将其格式化为客户端上的时间间隔

另一个选项是在求和之前将
datetime
转换为
float
,然后返回到datetime:

SELECT cast( sum(cast(EndTime - BeginTime as datetime)) as datetime) AS TotalOffset
FROM TimeRegister 
WHERE OrderNumber = 00000 AND Activity = 11111;
2天的持续时间如下所示:

1900-01-03 00:00:00.000
这是因为
datetime
可以转换为浮点,其整数部分表示从1900-01-01到时间的偏移量和小数部分

使用C#等语言编写的客户机支持间隔,可以从中减去
1900-01-01
,以获取实际持续时间,例如:

TimeSpan duration = sumResult - new DateTime(1900,1,1);
另一种选择是避免最后的强制转换,只使用产生的
float
值作为天数

在Excel中显示

最后一个选项可能是在Excel中显示持续时间的最简单方法!Excel日期实际上存储为浮动。使它们显示为日期或时间的是单元格的格式

您可以将单元格格式设置为
[h]:mm:ss
,以显示任意数字作为持续时间。
[]
很重要-如果没有它,Excel将只显示“日期”的时间部分

如果在单元格中输入
2
h:mm:ss
将显示为
0:00:00
,而
[h]:mm:ss
将显示
48:00:00
,48小时

尽管很奇怪

SELECT sum(cast(EndTime - BeginTime as datetime)) AS TotalDuration
FROM TimeRegister 
WHERE OrderNumber = 00000 AND Activity = 11111;

可能是在Excel中显示持续时间总和的最佳选项首先,尝试通过转换为文本来解决日期或数字问题无法解决任何问题,它会添加其他问题,如转换失败或意外结果

SQL Server没有时间间隔类型。如果减去两个
datetime
值,则返回另一个
datetime
值,该值表示自1900-01-01以来的偏移量。以下查询:

select getdate() - dateadd(d,-1,getdate())
将返回:

1900-01-02 00:00:00.000
这是1900-01-01之后的一整天

datetime
值不能求和。SQL Server确实有一个
time
类型,但它只表示一天中的时间。即使
今天-昨天
有效,将其转换为
时间
也会返回
00:00

快速解决方案是使用
DATEDIFF
以所需的任何单位计算两个日期之间的差值-小时、分钟、秒等。请注意,
DATEDIFF
返回跨越的间隔边界数
DATEDIFF(DAY,…)
昨天晚上11点到今天凌晨1点之间将返回1,因为1天的边界已跨越

你可以用

SELECT sum(datediff(minute,EndTime,BeginTime)) AS TotalMinutes
FROM TimeRegister 
WHERE OrderNumber = 00000 AND Activity = 11111;
以分钟为单位计算差异,并将其格式化为客户端上的时间间隔

另一个选项是在求和之前将
datetime
转换为
float
,然后返回到datetime:

SELECT cast( sum(cast(EndTime - BeginTime as datetime)) as datetime) AS TotalOffset
FROM TimeRegister 
WHERE OrderNumber = 00000 AND Activity = 11111;
2天的持续时间如下所示:

1900-01-03 00:00:00.000
这是因为
datetime
可以转换为浮点,其整数部分表示从1900-01-01到时间的偏移量和小数部分

使用C#等语言编写的客户机支持间隔,可以从中减去
1900-01-01
,以获取实际持续时间,例如:

TimeSpan duration = sumResult - new DateTime(1900,1,1);
另一种选择是避免最后的强制转换,只使用产生的
float
值作为天数

在Excel中显示

最后一个选项可能是在Excel中显示持续时间的最简单方法!Excel日期实际上存储为浮动。是什么造就了他们