SQL Server 计算两个时间相差

在 SQL Server 中,计算两个时间字符串之间的差值

  • 首先将这些字符串转换成日期/时间类型(如 datetime 或 datetime2)
  • 然后使用日期函数来计算它们之间的差异。

1、计算两个时间字符串之间的差值

案例:计算 starttime 和 endtime 两个时间点之间的时间差(以秒为单位)。

复制代码
test 表中有以下数据:
starttime endtime
2024-10-12 10:00:00 2024-10-12 10:30:00
2024-10-12 11:00:00 2024-10-12 11:45:00

以下是完整的 SQL 语句:

sql 复制代码
SELECT DATEDIFF(SECOND, CAST(starttime AS DATETIME), CAST(endtime AS DATETIME)) AS "时间差" FROM test;

解释

  • CAST(starttime AS DATETIME):将 starttime 字符串转换为 DATETIME 类型。
  • CAST(endtime AS DATETIME):将 endtime 字符串转换为 DATETIME 类型。
  • DATEDIFF(SECOND, ...):计算两个 DATETIME 值之间的秒数差。

执行上述查询后,结果将是:

时间差
1800
2700

2、字符串转换成日期/时间类型

假设 starttime 是一个 VARCHAR 类型的列,存储了形如 '2024-10-12 10:00:00' 的字符串

sql 复制代码
SELECT CAST(starttime AS DATETIME) AS StartTimeAsDatetime FROM test;
复制代码
test是包含 starttime 列的表名。查询会返回一个新的列 StartTimeAsDatetime,其中包含了转换后的 DATETIME 值。
  • 如果 starttime 的格式是 'yyyy-MM-dd HH:mm:ss',那么可以直接转换。
  • 如果 starttime 的格式不正确,CAST 会失败并抛出错误。在这种情况下,你可能需要使用 CONVERT 函数,并指定样式代码来正确解析日期时间字符串。

例如,如果 starttime 的格式是 'MM/dd/yyyy HH:mm:ss' , '10/12/2024 12:09:36' 的字符串

sql 复制代码
SELECT CONVERT(DATETIME, starttime, 2) AS StartTimeAsDatetime FROM test;
复制代码
 2 是样式代码,表示输入的日期时间字符串格式为 'MM/dd/yyyy HH:mm:ss'
 样式代码 2 实际上对应的是 'yy.mm.dd' 格式的日期,而不是包含时间部分的完整日期时间。
 如果你的 starttime 字符串包含了时间部分,并且格式是 'MM/dd/yyyy HH:mm:ss',你应该使用样式代码 102 或其他适当的样式代码。

以下是一些常见的日期时间样式代码:

样式代码 日期格式
102 mm/dd/yyyy
103 dd/mm/yyyy
104 dd.mm.yyyy
105 dd-mm-yyyy
106 dd mon yyyy
107 mon dd, yyyy
108 hh:mi:ss
109 mon dd yyyy hh:mi:ss:mmmAM (or PM)
110 mm-dd-yyyy
111 yyyy/mm/dd
112 yyyymmdd
113 dd mmm yyyy hh:mi:ss:mmm(24h)

假设你的 starttime 字符串格式是 'MM/dd/yyyy HH:mm:ss',你可以这样使用 CONVERT:

sql 复制代码
SELECT CONVERT(DATETIME, starttime, 102) AS StartTimeAsDatetime FROM test;

3、计算两个日期和时间之间的差值

案例:

计算 startdate 和 enddate 两个日期之间的天数差。

复制代码
test 表中有以下数据:
startdate enddate
2024-10-12 2024-10-15
2024-10-18 2024-10-22
sql 复制代码
SELECT DATEDIFF(DAY, startdate, enddate) AS "天数差"
FROM test;
  • DATEDIFF(DAY, startdate, enddate):计算 startdate 和 enddate 之间的天数差。
  • AS "天数差":为结果列指定一个别名,使其更具可读性。

执行上述查询后,结果将是:

天数差
3
4

模板

sql 复制代码
select DATEDIFF(unit, startdate, enddate) from test
  • unit 是时间单位,可以是 SECOND, MINUTE, HOUR, DAY, MONTH, YEAR 等。
  • startdate 和 enddate 是你要比较的两个日期/时间值。
  • 第二个日期比第一个日期早,结果将是一个负数
相关推荐
YangYang9YangYan6 分钟前
大数据时代数据分析的价值与前景
大数据·数据挖掘·数据分析
qyr678915 分钟前
全球汽车AI智能体市场调研与行业发展趋势
大数据·人工智能·数据分析·汽车·生活·汽车ai智能体
一只大袋鼠18 分钟前
MyBatis 进阶实战(四): 连接池、动态 SQL、多表关联(一对多 / 多对一 / 多对多)
java·开发语言·数据库·sql·mysql·mybatis
电商API&Tina24 分钟前
【1688API接口】1688 开放平台 API 接入心得
java·开发语言·数据库·python·sql·json
你觉得脆皮鸡好吃吗34 分钟前
什么是SQL注入(入门详解)
数据库·sql·网络安全
YangYang9YangYan35 分钟前
2026体制内学数据分析的价值与应用前景
数据挖掘·数据分析
Mr数据杨41 分钟前
医学影像分类模型构建与辅助诊断落地
机器学习·数据分析·kaggle
数据库小组11 小时前
MySQL 删库后怎么恢复?binlog2sql 之外,NineData 还能做什么
数据库·sql·mysql·安全·数据·ninedata·删库
competes12 小时前
慈善基金投资底层逻辑应用 顶层代码低代码配置平台开发结构方式数据存储模块
java·开发语言·数据库·windows·sql
0xDevNull13 小时前
MySQL 别名(Alias)指南:从入门到避坑
java·数据库·sql