首页 > 解决方案 > 将 SQL Server 函数迁移到 PostgreSQL

问题描述

我怎样才能执行这些在 SQL Server 中写入到 PostgreSQL 的相同转换。

这些是我收到的数据:

@AVLData_GPSElement_Longitude   @AVLData_GPSElement_Latitude
D224E31D                        F8C95DB9

这是用 SQL Server 编写的转换。

SUBSTRING(CONVERT(VARCHAR(50), CONVERT(INT, CONVERT(VARBINARY, @AVLData_GPSElement_Latitude, 2))), 1, 3) + '.' + SUBSTRING(CONVERT(VARCHAR(50), CONVERT(INT, CONVERT(VARBINARY, @AVLData_GPSElement_Latitude, 2))), 4, 7)

SUBSTRING(CONVERT(VARCHAR(50), CONVERT(INT, CONVERT(VARBINARY, @AVLData_GPSElement_Longitude, 2))), 1, 3) + '.' + SUBSTRING(CONVERT(VARCHAR(50), CONVERT(INT, CONVERT(VARBINARY, @AVLData_GPSElement_Longitude, 2))), 4, 7)

它给出的结果如下:

@MOPO_LAT        @MOPO_LON
-12.102099900   -76.933449900

到目前为止,我已经设法进行了这种转换:

SUBSTRING(CONVERT(VARBINARY, AVLData_GPSElement_Latitude, 2)::INTEGER ::VARCHAR FROM 1 FOR 3) + '.' + SUBSTRING(CONVERT(VARBINARY, AVLData_GPSElement_Latitude, 2)::INTEGER ::VARCHAR) FROM 4 FOR 7);

但我的大问题出现在这个函数中:

CONVERT (VARBINARY, @AVLData_GPSElement_Latitude, 2)

我不知道如何翻译它,因为我找不到太多关于它的信息。我正在转换 teltonika fm920 gps 设备。我提前感谢您的帮助。

标签: sql-serverpostgresqlplpgsql

解决方案


该函数首先将十六进制转换为整数。F8C95DB9-121020999使用这里的技术x在前面粘贴一个,以便bit(32)将其转换为十六进制,然后将其转换为 32 位整数。

select ('x'||'F8C95DB9')::bit(32)::int4
    int4    
------------
 -121020999

然后除以 10000000.0。

select ('x'||'F8C95DB9')::bit(32)::int4 / 10000000.0 as lat;
         lat          
----------------------
 -12.1020999000000000

那时我会停下来,将进一步的格式留给显示层。

注意:如果您使用纬度和经度,请考虑PostGIS


推荐阅读