switching to date_part as it seems to be more versatile
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / SQLMaker / Pg.pm
CommitLineData
8aac0b48 1package # Hide from PAUSE
2 DBIx::Class::SQLMaker::Pg;
3
4use base qw( DBIx::Class::SQLMaker );
5use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/;
c6b54adf 6
7sub _datetime_now_sql { 'NOW()' }
8
8aac0b48 9{
10 my %part_map = (
37256abd 11 century => 'CENTURY',
12 decade => 'DECADE',
a963b71d 13 day => 'DAY',
37256abd 14 day_of_month => 'DAY',
15 day_of_week => 'DOW',
16 day_of_year => 'DOY',
17 seconds_since_epoch => 'EPOCH',
18 hour => 'HOUR',
19 iso_day_of_week => 'ISODOW',
20 iso_year => 'ISOYEAR',
21 microsecond => 'MICROSECONDS',
22 millenium => 'MILLENIUM',
23 millisecond => 'MILLISECONDS',
24 minute => 'MINUTE',
25 month => 'MONTH',
26 quarter => 'QUARTER',
27 second => 'SECOND',
28 timezone => 'TIMEZONE',
29 timezone_hour => 'TIMEZONE_HOUR',
30 timezone_minute => 'TIMEZONE_MINUTE',
31 week => 'WEEK',
32 year => 'YEAR',
8aac0b48 33 );
34
2aedbd3d 35 my %diff_part_map = %part_map;
2aedbd3d 36
c33937bf 37 sub _datetime_sql {
38 die $_[0]->_unsupported_date_extraction($_[1], 'PostgreSQL')
39 unless exists $part_map{$_[1]};
a963b71d 40 "date_part('$part_map{$_[1]}', $_[2])"
c33937bf 41 }
42 sub _datetime_diff_sql {
43 die $_[0]->_unsupported_date_diff($_[1], 'PostgreSQL')
44 unless exists $diff_part_map{$_[1]};
35621f12 45 my $field_to_extract;
46 if ( $diff_part_map{$_[1]} eq 'SECOND' ) {
47 $field_to_extract = "EPOCH" ;
48 } else {
49 $field_to_extract = $diff_part_map{$_[1]};
50 }
51 ## adjusting this HERE as second will be needed elsewhere
a963b71d 52 "date_part('$field_to_extract', $_[2]) - date_part('$field_to_extract', $_[3])"
c33937bf 53 }
c6b54adf 54
55 sub _reorder_add_datetime_vars {
56 my ($self, $amount, $date) = @_;
57
58 return ($date, $amount);
59 }
60
61 sub _datetime_add_sql {
62 my ($self, $part, $date, $amount) = @_;
63
64 die $self->_unsupported_date_adding($part, 'PostgreSQL')
65 unless exists $diff_part_map{$part};
66
a963b71d 67 return "($date + $amount * interval '1 $part_map{$part}')"
c6b54adf 68 }
8aac0b48 69}
70
dff53b7e 71=head1 DATE FUNCTION IMPLEMENTATION
72
73The function used to extract date information is C<EXTRACT>, which supports
74
75 century
76 decade
77 day_of_month
78 day_of_week
79 day_of_year
80 seconds_since_epoch
81 hour
82 iso_day_of_week
83 iso_year
84 microsecond
85 millenium
86 millisecond
87 minute
88 month
89 quarter
90 second
91 timezone
92 timezone_hour
93 timezone_minute
94 week
95 year
96
97The function used to diff dates is subtraction and C<EXTRACT>, which supports
98
99 century
100 decade
101 day
102 seconds_since_epoch
103 hour
104 iso_day_of_week
105 iso_year
106 microsecond
107 millenium
108 millisecond
109 minute
110 month
111 quarter
112 second
113 timezone
114 timezone_hour
115 timezone_minute
116 week
117 year
118
119=cut
120
121
8aac0b48 1221;