⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 date.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 2 页
字号:
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("&month_first_day_of_year($_[0], $_[1]) + &days_in_month($_[0], $_[1]) -1");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::DaysInMonth;
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the number of days in the month I<expr1>, in year I<expr2>.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&days_in_month(E<lt> I<expr1> E<gt>, E<lt> I<expr2> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'days_in_month');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("my \@g_@{[ uc($self->name()) ]}_LEAP = (0,31,29,31,30,31,30,31,31,30,31,30,31); # \&@{[ $self->name() ]}()");
		$c->code("my \@g_@{[ uc($self->name()) ]} = (0,31,28,31,30,31,30,31,31,30,31,30,31); # \&@{[ $self->name() ]}()");
		return $c;
	}
	sub translate # args: month, year
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("($_[1] % 4 == 0 ? \$g_@{[ uc($self->name()) ]}_LEAP\[$_[0]] : \$g_@{[ uc($self->name()) ]}\[$_[0]])");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::MonthNumber;
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returhs the month number for the month name in I<expr>. The month name may be in either short (3 character) of long (full name) format.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&month_number(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'month_number');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("my \%g_MONTH_NUM = ");
		$c->code("(");
		$c->over();
		map
		(
			$c->code("@{[ uc($_->name()) ]} => '@{[ sprintf(q{%02d}, $_->month_number()) ]}',"),
			$self->catalogue()->months()->to_array()
		);
		map
		(
			$c->code("@{[ uc(substr($_->name(), 0, 3)) ]} => '@{[ sprintf(q{%02d}, $_->month_number()) ]}',"),
			$self->catalogue()->months()->to_array()
		);
		$c->back();
		$c->code("); # \&@{[ $self->name() ]}()");
		return $c;
	}
	sub translate # args: month_name
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("\$g_MONTH_NUM{qq#\@{[ uc($_[0]) ]}#}");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::MonthName;
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the month full-name for the month number in I<expr>.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&month_name(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'month_name');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("my \%g_MONTH_NAME = ");
		$c->code("(");
		$c->over();
		map
		(
			do {
				$c->code("@{[ $_->month_number() ]} => '@{[ $_->name() ]}',");
			},
			$self->catalogue()->months()->to_array()
		);
		$c->back();
		$c->code("); # \&@{[ $self->name() ]}()");
		return $c;
	}
	sub translate # args: month_number
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("\$g_MONTH_NAME{int($_[0])}");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::MonthAbbr;
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the month short-name (3 character) for the month number in I<expr>.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&month_abbr(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'month_abbr');
	use Class::STL::ClassMembers::Constructor;
	sub translate # args: month_number
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("uc(substr(&month_name($_[0]), 0, 3))");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::AddDays;
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Adds the number of days in I<expr> to the current date and returns this date value.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&add_days(E<lt> I<expr> E<gt>)'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'add_days');
	use Class::STL::ClassMembers::Constructor;
	sub translate # args: days
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code();
		$c->code("do { my \@tm=localtime(time()+(($_[0]) *24*60*60)); sprintf(qq{%04d%02d%02d}, \$tm[5]+1900, \$tm[4]+1, \$tm[3]); }");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Today;
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns todays date in the format specified in the date-type I<expr> (or I<default_datetype> property if not specified).'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&today([ E<lt> I<expr> E<gt> ])'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'today');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("my \$g_TODAY=sprintf(qq{%04d%02d%02d}, (localtime)[5]+1900, (localtime)[4]+1, (localtime)[3]); # Macro:@{[ $self->name() ]}()");
		return $c;
	}
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		defined($_[0]) && $_[0] ne ''
			? $c->code("&to_date(\$g_TODAY<YYYYMMDD>, $_[0])")
			: $c->code("\$g_TODAY");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::TodayYear;
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the year number for the current system date.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&today_year()'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'today_year');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("my \$g_TODAY_YEAR = (localtime)[5] + 1900; # \&@{[ $self->name() ]}()");
		return $c;
	}
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("\$g_TODAY_YEAR");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::TodayMonth;
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the month number for the current system date.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&today_month()'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'today_month');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("my \$g_TODAY_MONTH = (localtime)[4]+1; # \&@{[ $self->name() ]}()");
		return $c;
	}
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("\$g_TODAY_MONTH");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::TodayDay;
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the day number for the current system date.'),
		Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&today_day()'),
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'today_day');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("my \$g_TODAY_DAY = (localtime)[3]; # \&@{[ $self->name() ]}()");
		return $c;
	}
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate(@_);
		$c->code("\$g_TODAY_DAY");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::MonthsSinceCache; # TODO: ???
	use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
	use Class::STL::ClassMembers 
		Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'months_since_cache');
	use Class::STL::ClassMembers::Constructor;
	sub code_init_global
	{
		my $self = shift;
		my $c = $self->SUPER::code_init_global(@_);
		$c->code("use constant _MONTHS_SINCE_C_TODAY_YEAR => int @{[ (localtime)[5] + 1900 ]}; # \&@{[ $self->name ]}()");
		$c->code("use constant _MONTHS_SINCE_C_TODAY_MONTH => int @{[ (localtime)[4]+1 ]}; # \&@{[ $self->name ]}()");
		$c->code("my \%_CACHE_MONTHS_SINCE;");	# if ($self->root->o_cache_months_since);
		return $c;
	}
	sub translate
	{
		my $self = shift;
		my $c = $self->SUPER::translate();
#>		return ("$_CACHE_MONTHS_SINCE{$_[0]} || ((_MONTHS_SINCE_C_TODAY_YEAR - int(substr($_[0], 0, 4))) * 12) + (_MONTHS_SINCE_C_TODAY_MONTH - int(substr($_[0], 4, 2)))");
		$c->code("$_[0] !~ /\\d+/ ? 0 : ((_MONTHS_SINCE_C_TODAY_YEAR - int(substr($_[0], 0, 4))) * 12) + (_MONTHS_SINCE_C_TODAY_MONTH - int(substr($_[0], 4, 2)))");
#		return ("((_MONTHS_SINCE_C_TODAY_YEAR - (unpack('a4 a2', $_[0]))[0]) * 12) + (_MONTHS_SINCE_C_TODAY_MONTH - (unpack('a4 a2', $_[0]))[1])");
		return $c;
	}
}
# ----------------------------------------------------------------------------------------------------
{
	package ETL::Pequel3::Type::Macros::Date;
	use ETL::Pequel3::Type::Extension;
	use base qw(ETL::Pequel3::Type::Extension::Abstract);
	use Class::STL::ClassMembers;
	use Class::STL::ClassMembers::SingletonConstructor;
	sub new_extra
	{
		my $self = shift;
		$self->catalogue()->macros()->push_front(
        	ETL::Pequel3::Type::Macros::ToDate->new(),
#>	       	ETL::Pequel3::Type::Macros::DateCmp->new(),
#>	       	ETL::Pequel3::Type::Macros::ToDmy->new(),
#>	       	ETL::Pequel3::Type::Macros::FromDmy->new(),
        	ETL::Pequel3::Type::Macros::MonthsSince->new(),
        	ETL::Pequel3::Type::Macros::MonthsBetween->new(),
        	ETL::Pequel3::Type::Macros::DateLastDay->new(),
        	ETL::Pequel3::Type::Macros::MonthLastDay->new(),
#>        	ETL::Pequel3::Type::Macros::DayOfWeek->new(),
        	ETL::Pequel3::Type::Macros::DateNextDay->new(),
        	ETL::Pequel3::Type::Macros::DateRangeValues->new(),
        	ETL::Pequel3::Type::Macros::DayOfYear->new(),
        	ETL::Pequel3::Type::Macros::MonthFirstDayOfYear->new(),
        	ETL::Pequel3::Type::Macros::MonthLastDayOfYear->new(),
        	ETL::Pequel3::Type::Macros::DaysInMonth->new(),
        	ETL::Pequel3::Type::Macros::AddDays->new(),
        	ETL::Pequel3::Type::Macros::Y->new(),
        	ETL::Pequel3::Type::Macros::D->new(),
        	ETL::Pequel3::Type::Macros::M->new(),
        	ETL::Pequel3::Type::Macros::Today->new(),
        	ETL::Pequel3::Type::Macros::TodayYear->new(),
        	ETL::Pequel3::Type::Macros::TodayMonth->new(),
        	ETL::Pequel3::Type::Macros::TodayDay->new(),
#<        	ETL::Pequel3::Type::Macros::MonthsSinceCache->new(),
        	ETL::Pequel3::Type::Macros::MonthNumber->new(),
        	ETL::Pequel3::Type::Macros::MonthName->new(), #MonthFullName
#>        	ETL::Pequel3::Type::Macros::DayName->new(),
        	ETL::Pequel3::Type::Macros::MonthAbbr->new(), #MonthAbbrName
#>        	ETL::Pequel3::Type::Macros::DaysInYear->new(),

#>			ETL::Pequel3::Type::Macros::Now->new,
#>			ETL::Pequel3::Type::Macros::Time->new,
#>			ETL::Pequel3::Type::Macros::DaysBetween->new,		# return num days between 2 dates
#>			ETL::Pequel3::Type::Macros::DateIsBetween->new,	# &date_is_between(dt1, dt2)
#>			ETL::Pequel3::Type::Macros::DayNumberToDate->new,	# return date for day number in year
#>			ETL::Pequel3::Type::Macros::AddMonths->new,		# return date plus months
		);
		return $self;
	}
}
# ----------------------------------------------------------------------------------------------------
1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -