rodbc 日期过滤器

Posted

技术标签:

【中文标题】rodbc 日期过滤器【英文标题】:rodbc date filter 【发布时间】:2013-02-22 08:59:35 【问题描述】:

我一直在尝试通过 RODBC 设置对 MS SQL 数据库的查询。不幸的是,我无法设置适当的日期过滤器。我尝试在引号和单引号、DATE 函数、括号中输入日期,但它不想工作。

代码如下:

    dbquery <- sqlQuery(dbhandle, 'SELECT ST03001, ST03003, ST03007, ST03015, ST03012, ST03020, ST03021, ST03022 
    FROM deh_10.dbo.ST031000 ST031000 
    WHERE (ST03015>'2013-01-01')')

我通常会收到此错误消息:

    "dbquery <- sqlQuery(dbhandle, 'SELECT ST03001, ST03003, ST03007, ST03015, ST03012,
     ST03020, ST03021, ST03022 FROM deh_10.dbo.ST031000 ST031000 WHERE
     (ST03015>DATE('2013"

在日期过滤器之后,我还有几个其他过滤器由 OR 彼此分隔(示例中不包括)。

【问题讨论】:

尝试转义查询字符串中的引号。将' 替换为\' 【参考方案1】:

最好使用粘贴来构造您的 sql 查询,特别是在处理日期时。在这里,我将日期转换为numeric,但它是可选的(这取决于数据库,我认为 MS SQL 会自动将字符转换为日期)。我使用 paste 和 sep ='\n' 创建查询:

例如:

query <- paste(
  'SELECT ST03001, ST03003, ST03007, ST03015, ST03012, ST03020, ST03021, ST03022 ',
  'FROM ST031000',
  paste("WHERE ST03015 >" , as.numeric(as.Date('2013-05-01')),sep=''),
  sep='\n')

然后使用猫:

cat(query)
SELECT ST03001, ST03003, ST03007, ST03015, ST03012, ST03020, ST03021, ST03022 
FROM ST031000
WHERE ST03015 >15826

您也可以这样做(无需转换为数字)

query <- paste(
+   'SELECT ST03001, ST03003, ST03007, ST03015, ST03012, ST03020, ST03021, ST03022 ',
+   'FROM ST031000',
+   paste("WHERE ST03015 >'" , as.Date('2013-05-01'),"'",sep=''),
+   sep='\n')

> cat(query)
SELECT ST03001, ST03003, ST03007, ST03015, ST03012, ST03020, ST03021, ST03022 
FROM ST031000
WHERE ST03015 >'2013-05-01'

这里是使用sqldf 包的示例。我创建了一些数据:

values <- as.data.frame(matrix(sample(1:100,8*6*3,rep=T),ncol=8))
colnames(values) <- c('ST03001', 'ST03003', 'ST03007', 'ST03015', 'ST03012', 'ST03020', 'ST03021', 'ST03022') 
values$ST03015 = seq(as.Date("2012/1/1"), as.Date("2013/06/1"), length.out= nrow(values))

然后:

sqldf(query <- paste(
  'SELECT ST03001, ST03003, ST03007, ST03015, ST03012, ST03020, ST03021, ST03022 ',
  'FROM ST031000',
  paste("WHERE ST03015 >" , as.numeric(as.Date('2013-05-01')),sep=''),
  sep='\n'))

     ST03001 ST03003 ST03007    ST03015 ST03012 ST03020 ST03021 ST03022
1      73      74      58 2013-05-01      82      85      88      58
2       8      63      71 2013-06-01      37      76      15      44

【讨论】:

以上是关于rodbc 日期过滤器的主要内容,如果未能解决你的问题,请参考以下文章

过滤数据集并将其从 SQL 服务器读取到 R

来自 Shiny 的 RODBC 多输入

RODBC posixct 日期字段使查询非常慢

使用 AngularJS 日期过滤器和 UTC 日期

SQL 日期过滤器:当开始日期 = 结束日期时返回结果

Logstash 日期过滤器无法正常工作