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. Всем спасибо, усе работает теперь. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	 |