;
}
+sub _unsupported_date_extraction {
+ "date part extraction not supported for part $_[1] with database $_[2]"
+}
+
+sub _unsupported_date_diff {
+ "date diff not supported for part $_[1] with database $_[2]"
+}
+
sub _datetime_sql { die 'date part extraction not implemented for this database' }
sub _datetime_diff_sql { die 'date diffing not implemented for this database' }
delete $diff_part_map{day_of_month};
delete $diff_part_map{day_of_week};
- sub _datetime_sql { "DATEPART('$part_map{$_[1]}', $_[2])" }
- sub _datetime_diff_sql { "DATEDIFF('$diff_part_map{$_[1]}', $_[2], $_[3])" }
+ sub _datetime_sql {
+ die $_[0]->_unsupported_date_extraction($_[1], 'Microsoft SQL Server')
+ unless exists $part_map{$_[1]};
+ "DATEPART('$part_map{$_[1]}', $_[2])"
+ }
+ sub _datetime_diff_sql {
+ die $_[0]->_unsupported_date_diff($_[1], 'Microsoft SQL Server')
+ unless exists $diff_part_map{$_[1]};
+ "DATEDIFF('$diff_part_map{$_[1]}', $_[2], $_[3])"
+ }
}
my %diff_part_map = %part_map;
$diff_part_map{day} = delete $diff_part_map{day_of_month};
- sub _datetime_sql { "EXTRACT($part_map{$_[1]} FROM $_[2])" }
- sub _datetime_diff_sql { "TIMESTAMPDIFF($diff_part_map{$_[1]}, $_[2], $_[3])" }
+ sub _datetime_sql {
+ die $_[0]->_unsupported_date_extraction($_[1], 'MySQL')
+ unless exists $part_map{$_[1]};
+ "EXTRACT($part_map{$_[1]} FROM $_[2])"
+ }
+ sub _datetime_diff_sql {
+ die $_[0]->_unsupported_date_diff($_[1], 'MySQL')
+ unless exists $diff_part_map{$_[1]};
+ "TIMESTAMPDIFF($diff_part_map{$_[1]}, $_[2], $_[3])"
+ }
}
1;
week_of_year => 'WEEK_OF_YEAR',
);
- sub _datetime_sql { "$part_map{$_[1]}($_[2])" }
+ sub _datetime_sql {
+ die $_[0]->_unsupported_date_extraction($_[1], 'Oracle')
+ unless exists $part_map{$_[1]};
+ "$part_map{$_[1]}($_[2])"
+ }
}
{
year => 'SQL_TSI_YEAR',
);
- sub _datetime_diff_sql { "TIMESTAMPDIFF($part_map{$_[1]}, $_[2], $_[3])" }
+ sub _datetime_diff_sql {
+ die $_[0]->_unsupported_date_diff($_[1], 'Oracle')
+ unless exists $part_map{$_[1]};
+ "TIMESTAMPDIFF($part_map{$_[1]}, $_[2], $_[3])"
+ }
}
1;
my %diff_part_map = %part_map;
$diff_part_map{day} = delete $diff_part_map{day_of_month};
- sub _datetime_sql { "EXTRACT($part_map{$_[1]} FROM $_[2])" }
- sub _datetime_diff_sql { "EXTRACT($diff_part_map{$_[1]} FROM ($_[2] - $_[3]))" }
+ sub _datetime_sql {
+ die $_[0]->_unsupported_date_extraction($_[1], 'PostgreSQL')
+ unless exists $part_map{$_[1]};
+ "EXTRACT($part_map{$_[1]} FROM $_[2])"
+ }
+ sub _datetime_diff_sql {
+ die $_[0]->_unsupported_date_diff($_[1], 'PostgreSQL')
+ unless exists $diff_part_map{$_[1]};
+ "EXTRACT($diff_part_map{$_[1]} FROM ($_[2] - $_[3]))"
+ }
}
1;
fractional_seconds => 'f',
);
- sub _datetime_sql { "STRFTIME('%$part_map{$_[1]}', $_[2])" }
+ sub _datetime_sql {
+ die $_[0]->_unsupported_date_extraction($_[1], 'SQLite')
+ unless exists $part_map{$_[1]};
+ "STRFTIME('%$part_map{$_[1]}', $_[2])"
+ }
}
sub _datetime_diff_sql {
} elsif ($part eq 'second') {
return "(STRFTIME('%s',$left) - STRFTIME('%s',$right))"
} else {
- die "part $part is not supported by SQLite"
+ die $_[0]->_unsupported_date_diff($_[1], 'SQLite')
}
}