SQL查询丢失信息
Posted
技术标签:
【中文标题】SQL查询丢失信息【英文标题】:SQL-query loses information 【发布时间】:2015-01-15 13:57:32 【问题描述】:我正在使用RODBC
在 R 中进行 SQL 查询。
查询以格式为我提供数据
Date(POSIXct); var1:var29
%Y-%m-%d %H:%M:%S; numeric_values
问题是,一旦查询超过一定长度,6960 obs 左右,29-30 个变量,包括日期,传递给 R 的信息开始看起来像这样:
Date(POSIXct); var1:var30
%Y-%m-%d; numeric_values
因此,我丢失了 "%H:%M:%S"
信息。我不知道为什么。如果我减少变量的数量,我可以在这种情况发生之前增加时间长度。
在 windows-server 2007 上是 ts-sql
。(我相信)
R 中的 SQL 调用示例:
sqlQuery(database, "SELECT [datetime], [0] as SYS, [1] as NO1, [2] as NO2, [7] as NO3, [9] as NO4, [19] as NO5, [5] as DK1,[6] as DK2, [25] as SE1,
[26] as SE2,[27] as SE3, [28] as SE4, [4] as FIN, [13] as DE, [14] as NL, [16] as FR, [15] as CH, [17] as AT, [20] as EE,
[36] as LT, [45] as LV, [42] as SI, [50] as IT, [44] as ES, [43] as BE, [74] as HU, [75] as CZ, [41] as UK
From
(
SELECT [area_id],[pris],[datetime]
FROM [BigData].[dbo].[Prices]
WHERE area_id in (0,1,2,7,9,19,5,6,25,26,27,28,4,13,14,16,15,17, 20, 36, 45, 42, 50, 44, 43, 74, 75, 41)
AND [datetime]>= cast(GETDATE()-290 as date)
AND [datetime]< cast(GETDATE()+0 as date)
) p
PIVOT(SUM([pris])
FOR [area_id] IN
([0], [1], [2], [7], [9], [19], [5],[6], [25],[26],[27], [28], [4], [13], [14], [16], [15], [17], [20],
[36], [45], [42], [50], [44], [43], [74], [75], [41]))
AS pvt
ORDER BY [datetime] asc ") -> prices
【问题讨论】:
【参考方案1】:解决方案 #1
您可以使用answer from kristang:(使用as.is
选项调用sqlQuery,获取字符串中的时间戳并在R 中使用as.POSIXct
转换列)。
解决方案 #2
但我认为更有效的解决方案是通过 SQL 表达式(以 SQL 服务器为例)获取数字类型的日期时间值:
sqlQuery( "select convert(float, my_date)*3600*24 as my_date from ...")
并将其从数字转换为POSIXct
:
df1$my_date <- as.POSIXct(df1$my_date, origin = "1900-01-01", tz = "UTC")
由于POSIXct
本质上是数字,因此获取和类型转换比使用 RODBC 的普通 sqlQuery 运行得更快。 RODBC 从文本字符串转换每个时间戳(在 sqlGetResults 函数中看起来像 .POSIXct 用法)。因此,即使 RODBC 返回完整的时间戳,该解决方案也是合理的。
附:如果您真的喜欢从文本转换,请参阅 fasttime 包中的 fastPOSIXct。
【讨论】:
太好了,谢谢。奇怪的是我找不到那个。以上是关于SQL查询丢失信息的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server UNION SUM 丢失重复值 [重复]
2013, '在查询期间丢失与 MySQL 服务器的连接 - Pymysql Microsoft sql server management Studio