在 SQL 中以 H:mm 格式计算小时数
Counting hours in format H:mm in SQL
我有一个关于营业时间的专栏:
|time|
--------------
8:54
5:32
4:34
7:12
12:55
10:32
3:54
2:35
我想统计我有多少行超过 5 小时?小时格式的东西对我来说有问题..格式是varchar(文本)。
我该怎么做?有什么想法吗?
谢谢!
我做的有点棘手,但它奏效了:
WITH A AS (
SELECT cast(substring(hours, 1, len(hours) -3) as INT) as TIME
FROM your_table
)
SELECT count(*) as MORE_THAN_5_HOURS
FROM A
WHERE TIME >= 5
您删除作为小时的文本的最后 3 个字母(8:54 将变为 8)
然后将其转换为 INT,将所有操作放入名为 A 的 table 中。
然后计算 A 中 TIME 大于 5 的所有行。
另一种选择
Select Cnt = count(*)
From YourTable
Where try_convert(decimal(10,2),replace([time],':','.')) > 5
结果
Cnt
5
请尝试以下解决方案。
- 第一步:将数据转换为
TIME(0)
数据类型。
- 第 2 步:通过
DATEPART(hour, ...)
built-in 获取其中的小时部分
函数。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, hour_min VARCHAR(10));
INSERT INTO @tbl (hour_min) VALUES
('8:54'),
('5:32'),
('4:34'),
('7:12'),
('12:55'),
('10:32'),
('3:54'),
('2:35');
-- DDL and sample data population, end
-- just to see
SELECT *
, _hour = DATEPART(hour, TRY_CAST(hour_min + ':00' AS TIME(0)))
FROM @tbl;
-- real deal
SELECT [counter] = COUNT(*)
FROM @tbl
WHERE DATEPART(hour, TRY_CAST(hour_min + ':00' AS TIME(0))) >= 5;
结果
+---------+
| counter |
+---------+
| 5 |
+---------+
我有一个关于营业时间的专栏:
|time|
--------------
8:54
5:32
4:34
7:12
12:55
10:32
3:54
2:35
我想统计我有多少行超过 5 小时?小时格式的东西对我来说有问题..格式是varchar(文本)。
我该怎么做?有什么想法吗?
谢谢!
我做的有点棘手,但它奏效了:
WITH A AS (
SELECT cast(substring(hours, 1, len(hours) -3) as INT) as TIME
FROM your_table
)
SELECT count(*) as MORE_THAN_5_HOURS
FROM A
WHERE TIME >= 5
您删除作为小时的文本的最后 3 个字母(8:54 将变为 8) 然后将其转换为 INT,将所有操作放入名为 A 的 table 中。 然后计算 A 中 TIME 大于 5 的所有行。
另一种选择
Select Cnt = count(*)
From YourTable
Where try_convert(decimal(10,2),replace([time],':','.')) > 5
结果
Cnt
5
请尝试以下解决方案。
- 第一步:将数据转换为
TIME(0)
数据类型。 - 第 2 步:通过
DATEPART(hour, ...)
built-in 获取其中的小时部分 函数。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, hour_min VARCHAR(10));
INSERT INTO @tbl (hour_min) VALUES
('8:54'),
('5:32'),
('4:34'),
('7:12'),
('12:55'),
('10:32'),
('3:54'),
('2:35');
-- DDL and sample data population, end
-- just to see
SELECT *
, _hour = DATEPART(hour, TRY_CAST(hour_min + ':00' AS TIME(0)))
FROM @tbl;
-- real deal
SELECT [counter] = COUNT(*)
FROM @tbl
WHERE DATEPART(hour, TRY_CAST(hour_min + ':00' AS TIME(0))) >= 5;
结果
+---------+
| counter |
+---------+
| 5 |
+---------+