当前位置: 首页 > 知识库问答 >
问题:

不能求和时间值,我不明白为什么?

祁默
2023-03-14

尽管有值,但我不能得到一个用户的值的和时间。

即使用户17有工作时间值,我也会在sumTW列中得到该用户的NULL值。我该怎么解决?

这就是我的查询看起来的样子:

SELECT DISTINCT Hours.*, CASE WHEN SUM(timeWorked) is null then '00:00' ELSE TIME_FORMAT(SUM(timeWorked), '%H:%i') END as sumTW FROM Hours 
WHERE Hours.stampingStatus = 1 GROUP BY Hours.whoWorked

下面是表格代码:

-- phpMyAdmin SQL Dump
-- version 4.9.5
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1:3306
-- Generation Time: Apr 25, 2021 at 01:47 PM
-- Server version: 10.5.9-MariaDB
-- PHP Version: 7.4.16

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `stud_v20_keser`
--

-- --------------------------------------------------------

--
-- Table structure for table `Hours`
--

CREATE TABLE `Hours` (
  `hourID` int(11) NOT NULL,
  `taskID` int(11) DEFAULT NULL,
  `whoWorked` int(11) NOT NULL,
  `startTime` timestamp NOT NULL DEFAULT current_timestamp(),
  `endTime` timestamp NOT NULL DEFAULT current_timestamp(),
  `timeWorked` time NOT NULL DEFAULT '00:00:00',
  `activated` tinyint(1) NOT NULL DEFAULT 1,
  `location` varchar(30) COLLATE utf8_danish_ci DEFAULT NULL,
  `phaseID` int(11) DEFAULT NULL,
  `absenceType` varchar(30) COLLATE utf8_danish_ci DEFAULT NULL,
  `overtimeType` int(1) DEFAULT NULL,
  `comment` longtext COLLATE utf8_danish_ci DEFAULT NULL,
  `commentBoss` longtext COLLATE utf8_danish_ci DEFAULT NULL,
  `isChanged` tinyint(1) NOT NULL DEFAULT 0,
  `stampingStatus` tinyint(1) NOT NULL DEFAULT 0,
  `taskType` varchar(30) COLLATE utf8_danish_ci NOT NULL DEFAULT 'Definert oppgave'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

--
-- Dumping data for table `Hours`
--

INSERT INTO `Hours` (`hourID`, `taskID`, `whoWorked`, `startTime`, `endTime`, `timeWorked`, `activated`, `location`, `phaseID`, `absenceType`, `overtimeType`, `comment`, `commentBoss`, `isChanged`, `stampingStatus`, `taskType`) VALUES
(295, 24, 1, '2021-04-22 12:02:46', '2021-04-22 16:02:50', '04:00:04', 1, 'sdf', NULL, NULL, NULL, 'Veldig bra\r\n', 'Flott', 1, 1, 'Prosjekt'),
(299, 33, 3, '2021-04-24 14:43:01', '2021-04-24 14:43:10', '00:00:09', 1, 'Andre Verdenskrig', NULL, NULL, NULL, NULL, NULL, 0, 1, 'Prosjekt'),
(298, 24, 4, '2021-04-22 11:00:00', '2021-04-23 16:00:00', '29:00:00', 1, 'kj', NULL, NULL, NULL, NULL, NULL, 1, 1, 'Prosjekt'),
(300, NULL, 16, '2021-04-24 18:08:58', '2021-04-24 20:09:03', '02:00:05', 1, 'Hjemme', NULL, NULL, NULL, 'asdadsasdasda', NULL, 0, 1, 'Administrativt'),
(301, 35, 16, '2021-04-24 18:09:27', '2021-04-24 21:09:36', '03:00:09', 1, 'Mac', NULL, NULL, NULL, NULL, NULL, 0, 1, 'Prosjekt'),
(302, NULL, 17, '2021-04-24 18:16:31', '2021-04-24 20:18:03', '02:01:32', 1, 'New New York', NULL, NULL, NULL, NULL, NULL, 0, 1, 'Prosjekt'),
(303, NULL, 17, '2021-04-24 18:18:18', '2021-04-24 20:21:59', '02:03:41', 1, 'New New York', NULL, NULL, NULL, NULL, NULL, 0, 1, 'Prosjekt');

--
-- Triggers `Hours`
--
DELIMITER $$
CREATE TRIGGER `calculateTimeWorked` BEFORE UPDATE ON `Hours` FOR EACH ROW SET NEW.timeWorked = TIMEDIFF(new.endTime, new.startTime)
$$
DELIMITER ;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `Hours`
--
ALTER TABLE `Hours`
  ADD PRIMARY KEY (`hourID`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `Hours`
--
ALTER TABLE `Hours`
  MODIFY `hourID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=304;

--
-- Constraints for dumped tables
--


/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

(这个表和原来的不一样,原来的有外键。我去掉它们只是为了能够再现同样的问题,同样的问题被报告了)。

共有1个答案

韦宣
2023-03-14

尝试添加02:01:3202:03:41时,MySQL(可能还有MariaDB)会发出警告:

mysql> select time_format(sum(t),'%H:%i:%s') from (select convert('02:01:32', time) as t union all select convert('02:03:41', time) ) x;
+--------------------------------+
| time_format(sum(t),'%H:%i:%s') |
+--------------------------------+
| NULL                           |
+--------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------+
| Level   | Code | Message                                 |
+---------+------+-----------------------------------------+
| Warning | 1292 | Truncated incorrect time value: '40473' |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)

求和时间给出40473的值,因为这些时间总和为4小时4分73秒。但是40473不能随时间转换,因为它是一种无用的格式

另一种添加时间字段的方法:

select sec_to_time(sum(t)) 
from (select time_to_sec('02:01:32') as t 
      union all 
      select time_to_sec('02:03:41')) x;

输出:04:05:13

 类似资料:
  • 当用户键入以下内容的答案时:system.out.println(“键入数字”); 它不会继续到我的代码的下一部分。

  • 所以,我正在为一个班级做这个作业。这是一个Java类,我应该做一个游戏,它掷两个骰子,把它们相加,然后把它们加到你的回合分数上。然后它会问你是否想继续玩下去。当你的轮次得分达到20分,或者当你决定通过时,它会进入电脑。它应该打印每个回合的分数,然后当有人得到100分时,它就会宣布胜利者。然而,不管怎样,无论我跑了多少圈,每一圈结束时的分数都是0。当一名玩家掷1时,他们的回合分数被取消,并转移到另一

  • 还不起作用。所以我放弃链接,我只是编码:

  • 下面是一个链表的简单实现。我刚刚添加了相关代码。首先,我向列表中添加一些值,10,990和10000。当我搜索相同的值时,对于key=10,我得到true,但是对于key=990和key=10000得到false,尽管它应该是true。另外,如果我将第二个值从990更改为99,并搜索key=99,这一次我得到的是true。 我不确定是否使用泛型类型。我想我在那里做错了什么。因为如果我用int替换泛

  • ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。 为什么会这样?因为我指定了在不满足任何条件的情况下分配给列的值。

  • 问题内容: 为什么投给打破,当是? 问题答案: 不幸的是,没有办法对中的数组进行这样的转换。您将必须迭代数组并分别转换每个对象。 原因是安全类型,根本无法确保无需迭代遍历数组的内容就可以将其转换为Uri,这就是为什么必须对其进行迭代并分别进行转换的原因。 基本上因为可以被其他对象继承,所以不能保证数组仅包含对象。但是强制转换为超类型将是可行的,因为那样的话,类型安全就可以了。