如何在Snowflake中从Datetime类型值里减去Time类型值?
Snowflake中Time与Datetime类型的减法运算问题
已知pdt.StartTime为Datetime类型,s_first.FromTimeOfDay为Time类型,需将后者从前者中做减法运算。
尝试执行以下代码时:
select (pdt.StartTime - (SELECT s_first.FromTimeOfDay::datetime FROM Shift s_first)) from RAW_CPMS_AAR.POWERBI_DowntimeTable AS PDT
Snowflake返回错误:invalid type [CAST(S_FIRST.FROMTIMEOFDAY AS TIMESTAMP_NTZ(9))] for parameter 'TO_TIMESTAMP_NTZ'
修改为指定Timestamp类型后:
select (pdt.StartTime::TIMESTAMP_NTZ(9) - (SELECT s_first.FromTimeOfDay::TIMESTAMP_NTZ(9) FROM Shift s_first)) from RAW_CPMS_AAR.POWERBI_DowntimeTable AS PDT
仍得到类似错误,需解决Time类型转换后完成减法的问题。
解决方法
Snowflake中无法直接将Time类型转换为Datetime/Timestamp类型(Time仅包含单日时间,缺少日期维度),正确思路是将Time转换为**时间间隔(INTERVAL)**后再运算:
方法1:简洁转换为INTERVAL直接相减
这是最简便的方式,直接将Time类型转为时间间隔,与Datetime做减法得到新的Datetime:
SELECT pdt.StartTime - (SELECT s_first.FromTimeOfDay::INTERVAL FROM Shift s_first) AS result_datetime FROM RAW_CPMS_AAR.POWERBI_DowntimeTable AS PDT
方法2:分步提取时间单位运算(语义更明确)
如果需要更清晰地拆解时间运算,可以提取Time的时、分、秒单位,用TIMESTAMPADD逐次减去:
SELECT TIMESTAMPADD(SECOND, -DATE_PART(SECOND, (SELECT s_first.FromTimeOfDay FROM Shift s_first)), TIMESTAMPADD(MINUTE, -DATE_PART(MINUTE, (SELECT s_first.FromTimeOfDay FROM Shift s_first)), TIMESTAMPADD(HOUR, -DATE_PART(HOUR, (SELECT s_first.FromTimeOfDay FROM Shift s_first)), pdt.StartTime) ) ) AS result_datetime FROM RAW_CPMS_AAR.POWERBI_DowntimeTable AS PDT
补充:若需求为计算时间差而非新Datetime
如果只是要得到两个时间的时长差值,可提取StartTime的时间部分后直接与Time类型相减:
SELECT TIME(pdt.StartTime) - (SELECT s_first.FromTimeOfDay FROM Shift s_first) AS time_duration_diff FROM RAW_CPMS_AAR.POWERBI_DowntimeTable AS PDT
返回结果为Time类型的时长差。
内容的提问来源于stack exchange,提问作者Mohamed Sharif
相关产品推荐
相关产品推荐

