无法解析代码中的日期,并且循环

时间:2017-08-03 13:41:37

标签: perl db2 dbi

#! /usr/bin/perl

use DBI;
use strict;
use Data::Dumper;

my $dbh = DBI->connect("DBI:DB2:xxx",'xxx','xxx',{ RaiseError => 0,  AutoCommit => 1 })
or die ("Could not connect to database :".DBI->errstr);

my %hash =
(
'2017-01-01 00:00:00' => '2017-01-31 00:00:00',
'2017-02-01 00:00:00' => '2017-02-28 00:00:00',
'2017-03-01 00:00:00' => '2017-03-31 00:00:00',
'2017-04-01 00:00:00' => '2017-04-30 00:00:00',
'2017-05-01 00:00:00' => '2017-05-31 00:00:00',
'2017-06-01 00:00:00' => '2017-06-30 00:00:00',
'2017-07-01 00:00:00' => '2017-07-31 00:00:00',
'2017-08-01 00:00:00' => '2017-08-31 00:00:00',
'2017-09-01 00:00:00' => '2017-09-30 00:00:00'
);

#open(my $fh , "+>/var/www/bin/filesample.txt");

foreach my $key(sort keys %hash) {
  chomp($key);
  #my $sql = "select distinct FID_CUST from session where DAT_END between ? and ?";
  my $sql = "select distinct FID_CUST from session where DAT_END between TIMESTAMP(?) and TIMESTAMP(?)";
  print "\$sql = $sql\n";
  my $sth = $dbh->prepare($sql);
  $sth->execute($key,$hash{$key}) or die "Couldn't execute statement: $DBI::errstr";
  print "sth: $sth\n";

  while (my $arr = $sth->fetchrow_arrayref()){
    print "in while\n";
    print "@$arr\n";
  }
  $sth->finish();
}
#close FH;
$dbh->disconnect;

在这里,我无法得到代码的错误,因为控件不会循环。请建议可以做些什么。我正在使用DB2数据库。我没有收到任何错误,但它根本不会显示任何输出。我已经将TIMESTAMP与占位符一起使用,但它显示出一些模糊错误。

2 个答案:

答案 0 :(得分:1)

documentation for TIMESTAMP说:

  

字符串或图形字符串,实际长度为14,表示yyyyxxddhhmmss形式的有效日期和时间,其中yyyy为年份,xx为月份, dd是一天,hh是小时,mm是分钟,ss是秒。

您传递的是实际长度为19的字符串,例如'2017-01-01 00:00:00'

传递以DB2期望的方式格式化的时间戳,例如: 20170101000000

如果这不起作用,请尝试DB2 documentation for error SQL0245N

中给出的建议
  

当函数的调用不明确时,将返回此错误。当有两个或更多可能的候选函数满足函数解析标准时会发生这种情况。

     

...

     

用户回复

     

更改SQL语句以将参数显式转换为所需的数据类型,函数的定义或SQL路径以从候选函数集中删除歧义,然后重试。

并将您的查询更改为:

select distinct FID_CUST 
from session 
where DAT_END between
     TIMESTAMP(cast(? as TIMESTAMP)) and
     TIMESTAMP(cast(? as TIMESTAMP))

或类似。

正如我所说,您的问题 没有任何Perl内容 。如果我为将字符串转换为TIMESTAMP而编写的语法不正确,请向数据库管理员询问正确的DB2 SQL语法。

答案 1 :(得分:1)

从当前格式更改所有时间戳文字

out <- run "ghc-mod" ["browse", "-d", "Prelude"]

'2017-01-01 00:00:00' => '2017-01-31 00:00:00',