Lipetsk *nix Association Forum Lipetsk *nix Association Forum
Новости:
 
*
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
16 Апреля 2024, 13:24:39


Войти


Страниц: [1]   Вниз
  Печать  
Автор Тема: Подсчет количества дней между датами Perl  (Прочитано 15322 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Yazichnik
Небритый одмин
*****

Карма: 8
Сообщений: 710

Mac OS X, Debian

ОС:
Linux Linux
Браузер:
Chrome 35.0.1916.114 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 Linux
Браузер:
Firefox 29.0 Firefox 29.0


WWW Награды
« Ответ #1 : 27 Мая 2014, 19:48:05 »

А какие там интервалы? Может просто Date::Calc не в курсе, что бывают високосные годы?
Записан
Yazichnik
Небритый одмин
*****

Карма: 8
Сообщений: 710

Mac OS X, Debian

ОС:
Linux Linux
Браузер:
Chrome 35.0.1916.114 Chrome 35.0.1916.114


Награды
« Ответ #2 : 27 Мая 2014, 20:35:36 »

Да нормальные они там, например 25.03.2014 и 08.04.2014
Образчик немного почищенный во вложении
Нихрена не понимаю, глюк плавает и разница в 1 или 2 дня в сумме
Записан
Yazichnik
Небритый одмин
*****

Карма: 8
Сообщений: 710

Mac OS X, Debian

ОС:
Windows 7 Windows 7
Браузер:
Firefox 29.0 Firefox 29.0


Награды
« Ответ #3 : 30 Мая 2014, 15:11:25 »

вообщем глюк наблюдается на количестве дней кратных 7, где первая и последняя даты имеют четные номера дней
Записан
desperate
Не говорите, как мне жить, а я не скажу, куда вам идти :)
Администратор
*****

Карма: 65535
Сообщений: 1254


OpenSuse 11.4 - XFCE

ОС:
Не определен(а) Не определен(а)
Браузер:
Firefox 29.0 Firefox 29.0


WWW Награды
« Ответ #4 : 04 Июня 2014, 00:40:47 »

А не пробовал немного усложнить код и использовать unixtime
Записан


Мой персональный блог "Шутки ради"
Yazichnik
Небритый одмин
*****

Карма: 8
Сообщений: 710

Mac OS X, Debian

ОС:
Linux Linux
Браузер:
Chrome 35.0.1916.114 Chrome 35.0.1916.114


Награды
« Ответ #5 : 04 Июня 2014, 06:58:21 »

не пробовал, сегодня на свежих данных попробую с костыликом, если не взлетит буду дальше курить
Записан
all
Небритый одмин
*****

Карма: 2
Сообщений: 730


Windows Vista Power Pack 2008)))

ОС:
Windows 7 Windows 7
Браузер:
Chrome 35.0.1916.114 Chrome 35.0.1916.114


Награды
« Ответ #6 : 05 Июня 2014, 22:15:52 »

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 Windows NT 6.3
Браузер:
Firefox 29.0 Firefox 29.0


WWW Награды
« Ответ #7 : 07 Июня 2014, 16:14:24 »

SELECT *, DATEDIFF(date1,date2) as days_nums FROM table WHERE 1
и нечего выдумывать) стоит учесть что цифра может быть отрицательной.

я так понял у него не база, а именно файлы определенного формата
Записан


Мой персональный блог "Шутки ради"
Yazichnik
Небритый одмин
*****

Карма: 8
Сообщений: 710

Mac OS X, Debian

ОС:
Linux Linux
Браузер:
Chrome 35.0.1916.114 Chrome 35.0.1916.114


Награды
« Ответ #8 : 08 Июня 2014, 17:17:53 »

я так понял у него не база, а именно файлы определенного формата
это dbf файл созданный в foxpro поэтому это в некоторой степени база данных, а вообще All прав, попробую на днях
« Последнее редактирование: 08 Июня 2014, 20:12:50 от Yazichnik » Записан
Yazichnik
Небритый одмин
*****

Карма: 8
Сообщений: 710

Mac OS X, Debian

ОС:
Linux Linux
Браузер:
Chrome 35.0.1916.153 Chrome 35.0.1916.153


Награды
« Ответ #9 : 16 Июня 2014, 17:46:12 »

Вообщем все как всегда) компилятор не виноват, виновато неточное техзадание. Если дата1 и дата2 равны, то должен был быть не 0 а 1. Всем спасибо, усе работает теперь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines

Valid XHTML 1.0! Valid CSS! Dilber MC Theme by HarzeM