Yazichnik
Небритый одмин
   
Карма: 8
Сообщений: 710
Mac OS X, Debian
ОС:
 Linux
Браузер:
 Chrome 35.0.1916.114
|
 |
« : 27 Мая 2014, 17:51:52 » |
|
Необходимо открыть dbf-файл, и посчитать между датами в двух столбцах количество дней. Код в целом родился несложный, но один косяк, количество дней получается на 1 меньше чем должно было бы быть. правильные данные дает программа которая формирует исходный dbf. Что в коде не так? #! /usr/bin/perl
use warnings; use Date::Calc qw(:all); use Date::Manip qw(ParseDate UnixDate); use DBI;
my $file_add = '/home/administrator/stac.txt'; my $dbf_name = '/home/administrator'; my $dbf_table = 'talon14.dbf';
my $p1_dnst_kd = 0; my $p1_st_kd = 0; my $p2_dnst_kd = 0; my $p2_st_kd = 0;
# подключаемся к БД, используя драйвер DBD::XBase $dbh = DBI->connect("dbi:XBase:$dbf_name") or die $DBI::errstr;
# делаем запрос $sth = $dbh->prepare("SELECT * FROM $dbf_table") or die $dbh->errstr; # выполняем запрос $sth->execute(1000) or die $sth->errstr();
# обходим по строчно полученный массив while (@row = $sth->fetchrow_array) { # Дневной стационар отделение новорожденных if (($row[1] == 15) and ($row[52] ne '')) { ($d1, $m1, $y1) = UnixDate($row[15], "%d", "%m", "%Y"); ($d2, $m2, $y2) = UnixDate($row[16], "%d", "%m", "%Y"); $p1_dnst_kd = $p1_dnst_kd + Delta_Days($y1, $m1, $d1, $y2, $m2, $d2) + 1; } # Дневной стационар отделение старшее if (($row[1] == 16) and ($row[52] ne '')) { ($d1, $m1, $y1) = UnixDate($row[15], "%d", "%m", "%Y"); ($d2, $m2, $y2) = UnixDate($row[16], "%d", "%m", "%Y"); $p2_dnst_kd = $p2_dnst_kd + Delta_Days($y1, $m1, $d1, $y2, $m2, $d2) + 1; print $d1."-".$m1."-".$y1." ".$d2."-".$m2."-".$y2." ".Delta_Days($y1, $m1, $d1, $y2, $m2, $d2) . "\n"; } # Стационар отделение новорожденных if (($row[1] == 15) and ($row[52] eq '')) { ($d1, $m1, $y1) = UnixDate($row[15], "%d", "%m", "%Y"); ($d2, $m2, $y2) = UnixDate($row[16], "%d", "%m", "%Y"); $p1_st_kd = $p1_st_kd + Delta_Days($y1, $m1, $d1, $y2, $m2, $d2); } # Стационар отделение старшее if (($row[1] == 16) and ($row[52] eq '')) { ($d1, $m1, $y1) = UnixDate($row[15], "%d", "%m", "%Y"); ($d2, $m2, $y2) = UnixDate($row[16], "%d", "%m", "%Y"); $p2_st_kd = $p2_st_kd + Delta_Days($y1, $m1, $d1, $y2, $m2, $d2); } }
# вывод в файл # открываем файл на запись open ADD, ">".$file_add or die "Can not open file ".$!; # выводим данные print ADD "Отчет по стационару\n"; print ADD "\n"; print ADD "Дневной стационар\n"; print ADD "Педиатрическое 1:\t" . $p1_dnst_kd . "\n"; print ADD "Педиатрическое 2:\t" . $p2_dnst_kd . "\n"; print ADD "\n"; print ADD "Круглосуточный стационар\n"; print ADD "Педиатрическое 1:\t" . $p1_st_kd . "\n"; print ADD "Педиатрическое 2:\t" . $p2_st_kd . "\n"; print ADD "\n"; close(ADD);
|