如何在Clarion中重写PostgreSQL时间间隔计算查询?
在Clarion环境中处理PostgreSQL时间间隔的方法及查询重写
Hey there! Let's walk through how to handle PostgreSQL time intervals in Clarion, plus rewrite that specific timestamp difference query to work seamlessly in a Clarion environment.
通用处理思路
When working with PostgreSQL time intervals in Clarion, you've got a couple reliable approaches:
- 借助Clarion数据库驱动调用PostgreSQL原生函数: Clarion通过ODBC或原生驱动能很好地和PostgreSQL协作,你可以直接执行原生PostgreSQL SQL,再把结果映射到Clarion变量中。
- 使用Clarion内置的日期时间工具: 如果你想避开数据库专属逻辑,Clarion自带了计算日期时间差的函数——只需要注意格式和单位转换即可。
- 注意类型映射: 确保Clarion变量类型和PostgreSQL返回的类型匹配,比如PostgreSQL的
numeric可以对应Clarion的DECIMAL或FLOAT类型。
目标查询的Clarion兼容重写
你的原PostgreSQL查询是通过将时间间隔转换为epoch秒数,再除以3600来计算两个时间戳的小时差。这里提供两种在Clarion中实现的方式:
方法1:在Clarion中执行原生PostgreSQL SQL
如果你已经通过Clarion的数据库层连接了PostgreSQL,可以直接运行原查询并获取结果。代码示例如下:
PROGRAM MAP END SQLConn LONG HourDiff DECIMAL(18,2) SQLQuery STRING(255) CODE ! 假设已经建立了有效的PostgreSQL连接(SQLConn为连接句柄) SQLQuery = 'SELECT EXTRACT(EPOCH FROM (TIMESTAMP ''02-01-2021 06:00'' - TIMESTAMP ''01-01-2021 22:00''))/3600 AS interval_as_hours_numeric' IF SQLExecute(SQLConn, SQLQuery) IF SQLFetch(SQLConn) ! 将数值结果读取到Clarion的DECIMAL变量中 SQLGetData(SQLConn, 1, SQL_C_DOUBLE, HourDiff, SIZEOF(HourDiff)) MESSAGE('时间差(小时): ' & STR(HourDiff, 10, 2)) END SQLCloseCursor(SQLConn) END
方法2:使用Clarion内置日期时间函数实现
如果你想完全在Clarion内部处理计算(不调用数据库),可以把时间戳转换为Clarion的DATETIME类型,再手动计算差值。注意Clarion的DATETIME差值单位是1/100秒,所以需要调整转换为小时:
PROGRAM MAP END StartDateTime DATETIME EndDateTime DATETIME HourDiff DECIMAL(18,2) CODE ! 将PostgreSQL格式的时间戳转换为Clarion默认的MM/DD/YYYY HH:MM:SS格式 StartDateTime = DATETIME('01/01/2021 22:00:00') EndDateTime = DATETIME('02/01/2021 06:00:00') ! 计算差值:(1/100秒) / (3600 * 100) = 小时数 HourDiff = (EndDateTime - StartDateTime) / 360000.0 MESSAGE('时间差(小时): ' & STR(HourDiff, 10, 2))
日期格式小提示
Clarion默认使用MM/DD/YYYY日期格式。如果你的输入时间戳是原查询中的DD-MM-YYYY格式,可以用Clarion的ParseDate()函数来转换:
StartDateTime = ParseDate('01-01-2021 22:00', 'DD-MM-YYYY HH:MM')
内容的提问来源于stack exchange,提问作者Matestro
相关产品推荐
相关产品推荐

