如何将R中POSIXt字面量转换为MS SQL日期时间字面量?
问题
我希望尽可能依赖dbplyr的自动翻译功能,在MS SQL中使用R的POSIXt常量,但转换结果出现异常:
library(dbplyr) dat <- lubridate::ymd_hms("2022-11-12 00:01:25") ## class(dat) ## [1] "POSIXct" "POSIXt" translate_sql(!!dat, con = simulate_mssql()) ## <SQL> '2022-11-12T00:01:25Z'
因此我只能通过日期的字符串表示来获取MS SQL可识别的格式:
translate_sql(!!format(dat, "%F %T"), con = simulate_mssql()) ## <SQL> '2022-11-12 00:01:25'
请问这是正确格式化日期的唯一方式吗?还是有某些不常见的区域设置导致R到MS SQL的转换出现问题?
回答
并非唯一方式,但
format()是最稳妥的通用方案
dbplyr对POSIXt类型的默认翻译会生成带T分隔符和Z时区标记的ISO 8601格式字符串,MS SQL虽能识别ISO格式,但旧版本或特定字段类型场景下可能出现兼容性问题。除手动用format()生成空格分隔的字符串,还可尝试以下方法:- 用dbplyr内置日期转换函数:借助
sql_datetime()或sql_date()封装POSIXt对象,强制生成MS SQL兼容格式:translate_sql(sql_datetime(!!dat), con = simulate_mssql()) - 匹配时区设置:若POSIXt对象时区与MS SQL服务器时区一致,可临时将R时区设为服务器时区(如
Sys.setenv(TZ = "UTC")),部分场景下dbplyr会生成不带Z标记的字符串,但此方法依赖时区匹配,通用性不如format()。
- 用dbplyr内置日期转换函数:借助
区域设置确实会影响转换结果
- 若R的
LC_TIME区域设置与MS SQL服务器的语言/区域不匹配,dbplyr自动翻译可能生成不符合服务器预期的格式。可通过Sys.getlocale("LC_TIME")查看当前设置,临时调整为对应区域(如Sys.setlocale("LC_TIME", "English_US"))后重试,但这种调整仅解决部分场景的格式问题,无法从根本消除ISO格式与MS SQL传统格式的差异。
- 若R的
内容的提问来源于stack exchange,提问作者thothal
相关产品推荐
相关产品推荐

