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);
|
|
|
Записан
|
|
|
|
NeO
Злобный админчик
Администратор
Карма: 62
Сообщений: 2376
Debian Stretch
ОС:
Linux
Браузер:
Firefox 29.0
|
А какие там интервалы? Может просто Date::Calc не в курсе, что бывают високосные годы?
|
|
|
Записан
|
|
|
|
Yazichnik
Небритый одмин
Карма: 8
Сообщений: 710
Mac OS X, Debian
ОС:
Linux
Браузер:
Chrome 35.0.1916.114
|
Да нормальные они там, например 25.03.2014 и 08.04.2014 Образчик немного почищенный во вложении Нихрена не понимаю, глюк плавает и разница в 1 или 2 дня в сумме
|
|
|
Записан
|
|
|
|
Yazichnik
Небритый одмин
Карма: 8
Сообщений: 710
Mac OS X, Debian
ОС:
Windows 7
Браузер:
Firefox 29.0
|
вообщем глюк наблюдается на количестве дней кратных 7, где первая и последняя даты имеют четные номера дней
|
|
|
Записан
|
|
|
|
desperate
Не говорите, как мне жить, а я не скажу, куда вам идти :)
Администратор
Карма: 65535
Сообщений: 1254
OpenSuse 11.4 - XFCE
ОС:
Не определен(а)
Браузер:
Firefox 29.0
|
А не пробовал немного усложнить код и использовать unixtime
|
|
|
Записан
|
|
|
|
Yazichnik
Небритый одмин
Карма: 8
Сообщений: 710
Mac OS X, Debian
ОС:
Linux
Браузер:
Chrome 35.0.1916.114
|
не пробовал, сегодня на свежих данных попробую с костыликом, если не взлетит буду дальше курить
|
|
|
Записан
|
|
|
|
all
Небритый одмин
Карма: 2
Сообщений: 730
Windows Vista Power Pack 2008)))
ОС:
Windows 7
Браузер:
Chrome 35.0.1916.114
|
SELECT *, DATEDIFF(date1,date2) as days_nums FROM table WHERE 1 и нечего выдумывать) стоит учесть что цифра может быть отрицательной.
|
|
« Последнее редактирование: 06 Июня 2014, 11:50:38 от all »
|
Записан
|
all-all-blog.blogspot.com - мысли о пингвинах, паяльниках и др. интересной хрени.
|
|
|
desperate
Не говорите, как мне жить, а я не скажу, куда вам идти :)
Администратор
Карма: 65535
Сообщений: 1254
OpenSuse 11.4 - XFCE
ОС:
Windows NT 6.3
Браузер:
Firefox 29.0
|
SELECT *, DATEDIFF(date1,date2) as days_nums FROM table WHERE 1 и нечего выдумывать) стоит учесть что цифра может быть отрицательной.
я так понял у него не база, а именно файлы определенного формата
|
|
|
Записан
|
|
|
|
Yazichnik
Небритый одмин
Карма: 8
Сообщений: 710
Mac OS X, Debian
ОС:
Linux
Браузер:
Chrome 35.0.1916.114
|
я так понял у него не база, а именно файлы определенного формата
это dbf файл созданный в foxpro поэтому это в некоторой степени база данных, а вообще All прав, попробую на днях
|
|
« Последнее редактирование: 08 Июня 2014, 20:12:50 от Yazichnik »
|
Записан
|
|
|
|
Yazichnik
Небритый одмин
Карма: 8
Сообщений: 710
Mac OS X, Debian
ОС:
Linux
Браузер:
Chrome 35.0.1916.153
|
Вообщем все как всегда) компилятор не виноват, виновато неточное техзадание. Если дата1 и дата2 равны, то должен был быть не 0 а 1. Всем спасибо, усе работает теперь.
|
|
|
Записан
|
|
|
|
|