Add datetime adding and now to MSSQL
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / SQLMaker / MSSQL.pm
1 package # Hide from PAUSE
2   DBIx::Class::SQLMaker::MSSQL;
3
4 use base qw( DBIx::Class::SQLMaker );
5
6 #
7 # MSSQL does not support ... OVER() ... RNO limits
8 #
9 sub _rno_default_order {
10   return \ '(SELECT(1))';
11 }
12
13 sub _datetime_now_sql { 'NOW()' }
14
15 {
16   my %part_map = (
17      year         => 'year',
18      quarter      => 'quarter',
19      month        => 'month',
20      day_of_year  => 'dayofyear',
21      day_of_month => 'day',
22      week         => 'week',
23      day_of_week  => 'weekday',
24      hour         => 'hour',
25      minute       => 'minute',
26      second       => 'second',
27      millisecond  => 'millisecond',
28      nanosecond   => 'nanosecond',
29   );
30
31   my %diff_part_map = %part_map;
32   $diff_part_map{day} = delete $diff_part_map{day_of_year};
33   delete $diff_part_map{day_of_month};
34   delete $diff_part_map{day_of_week};
35
36   sub _datetime_sql {
37     die $_[0]->_unsupported_date_extraction($_[1], 'Microsoft SQL Server')
38        unless exists $part_map{$_[1]};
39     "DATEPART($part_map{$_[1]}, $_[2])"
40   }
41   sub _datetime_diff_sql {
42     die $_[0]->_unsupported_date_diff($_[1], 'Microsoft SQL Server')
43        unless exists $diff_part_map{$_[1]};
44     "DATEDIFF($diff_part_map{$_[1]}, $_[2], $_[3])"
45   }
46
47   sub _reorder_diff_datetime_vars {
48     my ($self, $d1, $d2) = @_;
49
50     return ($d2, $d1);
51   }
52
53   sub _datetime_add_sql {
54     my ($self, $part, $amount, $date) = @_;
55
56     die $self->_unsupported_date_adding($part, 'Microsoft SQL Server')
57       unless exists $diff_part_map{$part};
58
59     my $placeholder = $self->_convert('?');
60     return "(DATEADD($diff_part_map{$part}, $amount, $date))"
61   }
62 }
63
64 =head1 DATE FUNCTION IMPLEMENTATION
65
66 The function used to extract date information is C<DATEPART>, which supports
67
68  year
69  quarter
70  month
71  day_of_year
72  day_of_month
73  week
74  day_of_week
75  hour
76  minute
77  second
78  millisecond
79
80 The function used to diff dates is C<DATEDIFF>, which supports
81
82  year
83  quarter
84  month
85  day
86  week
87  hour
88  minute
89  second
90  millisecond
91
92 =cut
93
94 1;