sql-server - 将 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 设备。我提前感谢您的帮助。
解决方案
该函数首先将十六进制转换为整数。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。
推荐阅读
- javascript - 如果电子邮件未使用我的功能验证,则阻止提交表单
- python - 如何将用户输入从一个文件附加到另一个 Python
- django - 如何使用 ajax 更新按钮和计数而不重定向?
- c# - 将具有 Action/Func 参数的同步方法转换为异步
- swiftui - 实现 TextField 时无法推断通用参数“C0”
- python - ResNet34 在 Keras.application 中可用吗?
- unity3d - unity3d:如何在运行时在 2 个导航网格之间进行交换?
- c++ - 并行将 64 位整数中的压缩 8 位整数减 1,没有硬件 SIMD 的 SWAR
- python - 更好的是 - 在将数据加载到雪花之前转换我的数据,或者将加载的数据克隆到所需的表
- python - DataFrame.Replace(r'regex', regex=True) 不工作