2011-01-25 87 views
1

道歉,如果这是一个非常简单的问题,但我有兴趣尝试达到准确的答案,而不仅仅是一个“四舍五入”的答案。从特定日期的年龄计算出生日期[MySQL或Perl]

我的问题是:我知道有人是2008年3月18日27.12(随机例子)。我怎样才能以最接近的近似值计算他的出生日期。年龄始终以实际数字提供至两位小数点。

回答

0

eumiro的答案是诀窍;以下使用Time::Piece模块(自5.10起与Perl捆绑在一起)可能更易于维护。

use strict; 
use warnings; 
use 5.010; 

use Time::Piece; 
use Time::Seconds; 

my ($date, $age) = ('2008-03-18', 27.12); 

my $birthday = Time::Piece->strptime($date, '%Y-%m-%d') - $age*ONE_YEAR; 
say $birthday->ymd(); 

由于该年龄段缺乏准确性(1/100年),这会在实际生日的几天内得到您。

0
use strict; 
use Time::Local; 

my $now = timelocal(0, 0, 12, 18, 3-1, 2008); 
my $birthday = $now - 27.12 * 365.25 * 86400; 
print scalar localtime $birthday; 

返回Mon Feb 2 22:04:48 1981

您的精度为0.01年,大致为3天,因此您甚至无法涵盖所有​​生日。

我的方法并没有很好地涵盖闰年,但是你无法真正用它们来计算。想象一下2008年3月1日。在这个日期之前什么日期是“1年零一天”? 2007年2月28日或2007年2月29日不存在?

+0

-1忘记闰日 – daxim 2011-01-25 12:30:35

2

由于四舍五入,通过简单分数计算的解决方案是1981-02-03和前一天。正如eumiro所说,1/100年的分辨率还不够精确,所以在实际的日期可能还有一两天。

use DateTime qw(); 
use POSIX qw(modf); 

my $date = DateTime->new(year => 2008, month => 3, day => 18); # 2008-03-18 
my $age = 27.12;             # 27.12 
my ($days, $years) = modf $age;         # (0.12, 27) 
$days *= 365.25;             # 43.83 
# approx. number of days in a year, is accurate enough for this purpose 

$date->clone->subtract(years => $years, days => $days);  # 1981-02-03 
$date->clone->subtract(years => $years, days => 1 + $days); # 1981-02-02 
0

一种允许更高精度的方法只需利用现有的MySQL日期/时间函数。如果在MySQL内部工作,可以通过在TO_SECONDS()转换中将两个日期中的每一个转换为秒来非常精确地计算年龄,然后将结果操作为期望的精度。在这些情况下,日期为'yyyy-mm-dd hh:mm:ss'格式,假定一年的平均长度为365.242天。

ROUND((TO_SECONDS(AnyDateTime) - TO_SECONDS(出生日期))/(365.242 * 60 * 60 * 24),3)年龄, 如:

ROUND((TOSECONDS('2013-01-01 00:00:00') - TO_SECONDS('1942-10-16')/(365.242*60*60*24),3) as AGE --> 70.214 

或者你可以使用DATEDIFF( )转换,它提供了几天的答案:

ROUND(DATEDIFF('2013-01-01 00:00:00','1942-10-16')/365.242,3) AS age --> 70.214