如何将 AM PM 转换为 SQL 中 timestampdiff 的时间戳?
Posted
技术标签:
【中文标题】如何将 AM PM 转换为 SQL 中 timestampdiff 的时间戳?【英文标题】:How to convert AM PM to timestamp for timestampdiff in SQL? 【发布时间】:2021-10-09 13:45:39 【问题描述】:我有一个生成的列,如果随着时间的推移不为空,则计算输入和超时的时间差。
ALTER TABLE tbl_dtr
ADD COLUMN total_worked_hours FLOAT(2) AS (CASE
WHEN time_out = '' then 0
WHEN over_time_out = '' then 0
WHEN time_out <> '' then (TIMESTAMPDIFF(SECOND, time_in, time_out) / 3600)
WHEN over_time_out <> '' then ((TIMESTAMPDIFF(SECOND, time_in, time_out) / 3600) + (TIMESTAMPDIFF(SECOND, over_time_in, over_time_out) / 3600))
END);
这里的问题是total_worked_hours列会导致null,我不知道如何将AM/PM转换为时间戳来计算timestamdiff。
id | date | time_in | time_out | over_time_in | over_time_out | total_worked_hours |
---|---|---|---|---|---|---|
1 | 2021-08-04 | 08:35 AM | 06:51 PM | 07:05 PM | 11:58 PM | NULL |
【问题讨论】:
用您正在使用的数据库标记您的问题。FLOAT(2)
应该是什么?
FLOAT(2) 是一种 total_worked_hours 类型,每行都会产生浮点值
【参考方案1】:
我的“快速而肮脏”的解决方案是:
SELECT
CASE WHEN SUBSTRING('08:35 AM',7,2)= 'AM'
THEN CONVERT(TIME,SUBSTRING('08:35 AM',1,5))
ELSE DATEADD(HOUR,12,CONVERT(TIME,SUBSTRING('08:35 AM',1,5)) ) END as time
基本上
使用格式“08:35 AM”为您的时间列添加子字符串 测试是上午还是下午 如果 AM >>>> CONVERT(TIME, Substringed value) else >>> CONVERT(TIME, Substringed value) + 12 hours现在您可以执行 DATEDIFF 操作了。
【讨论】:
这显示错误 #1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 2 行的“CASE WHEN SUBSTRING(time_in,7,2) = 'AM' THEN CONVERT(TIME,SUBSTRING(time_in...') 附近使用正确的语法 我测试过,它可以在我的“ms sql server”上运行。 MariaDB 使用不同的 sinthax 添加日期...你应该用 DATE_ADD 替换 DATEADD以上是关于如何将 AM PM 转换为 SQL 中 timestampdiff 的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
将 mysql TIME 从 24 HR 转换为 AM/PM 格式
SQL - 将 varchar (dd/mm/yyyy hh.mm AM/PM) 转换为日期时间
如何将日期/时间从 24 小时格式转换为 12 小时 AM/PM? [复制]