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 是你要比较的两个日期/时间值。
  • 第二个日期比第一个日期早,结果将是一个负数
相关推荐
Irene19913 小时前
大数据开发的常见实践:把 SQL 直接写在 Shell 脚本里 ER图 数据血缘
sql·数据血缘·er
川石课堂软件测试3 小时前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
qq_366086225 小时前
sql 查询中关于 null 值判断的问题
数据库·sql
测试修炼手册5 小时前
[测试技术] JUnit 6 入门与实战:断言、参数化与 Mockito
数据库·junit·sqlserver
AC赳赳老秦6 小时前
OpenClaw 采集任务日志审计:全程记录采集行为,满足合规溯源与企业审计要求
java·大数据·python·数据挖掘·数据分析·php·openclaw
金伟API10247 小时前
常见的SQL面试题:经典50例
数据库·人工智能·笔记·sql·学习
学术小白人7 小时前
【倒计时4个月】-AI赋能图像处理与计算机视觉技术国际学术研讨会
网络·人工智能·神经网络·数据分析·光学
babe小鑫8 小时前
2026低薪岗位转型学数据分析的价值
数据挖掘·数据分析
YangYang9YangYan8 小时前
2026自动化背景无项目经验转数据分析的可行性分析
运维·数据分析·自动化
datagear9 小时前
DataGear 6.0.0 新特性之本地图表
数据分析·html·数据可视化