Module Sequel::SQL::DateAdd::DatasetMethods
In: lib/sequel/extensions/date_arithmetic.rb

These methods are added to datasets using the date_arithmetic extension, for the purposes of correctly literalizing DateAdd expressions for the appropriate database type.

Methods

Constants

DURATION_UNITS = [:years, :months, :days, :hours, :minutes, :seconds].freeze
DEF_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| s.to_s.freeze}).freeze
MYSQL_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit(s.to_s.upcase[0...-1]).freeze}).freeze
MSSQL_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit(s.to_s[0...-1]).freeze}).freeze
H2_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| s.to_s[0...-1].freeze}).freeze
DERBY_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit("SQL_TSI_#{s.to_s.upcase[0...-1]}").freeze}).freeze
ACCESS_DURATION_UNITS = DURATION_UNITS.zip(%w'yyyy m d h n s'.map(&:freeze)).freeze
DB2_DURATION_UNITS = DURATION_UNITS.zip(DURATION_UNITS.map{|s| Sequel.lit(s.to_s).freeze}).freeze

Public Instance methods

Append the SQL fragment for the DateAdd expression to the SQL query.

[Source]

     # File lib/sequel/extensions/date_arithmetic.rb, line 71
 71:         def date_add_sql_append(sql, da)
 72:           if defined?(super)
 73:             return super
 74:           end
 75:           h = da.interval
 76:           expr = da.expr
 77:           cast = case db_type = db.database_type
 78:           when :postgres
 79:             interval = String.new
 80:             each_valid_interval_unit(h, DEF_DURATION_UNITS) do |value, sql_unit|
 81:               interval << "#{value} #{sql_unit} "
 82:             end
 83:             if interval.empty?
 84:               return literal_append(sql, Sequel.cast(expr, Time))
 85:             else
 86:               return complex_expression_sql_append(sql, :+, [Sequel.cast(expr, Time), Sequel.cast(interval, :interval)])
 87:             end
 88:           when :sqlite
 89:             args = [expr]
 90:             each_valid_interval_unit(h, DEF_DURATION_UNITS) do |value, sql_unit|
 91:               args << "#{value} #{sql_unit}"
 92:             end
 93:             return function_sql_append(sql, Sequel.function(:datetime, *args))
 94:           when :mysql, :hsqldb
 95:             if db_type == :hsqldb
 96:               # HSQLDB requires 2.2.9+ for the DATE_ADD function
 97:               expr = Sequel.cast(expr, Time)
 98:             end
 99:             each_valid_interval_unit(h, MYSQL_DURATION_UNITS) do |value, sql_unit|
100:               expr = Sequel.function(:DATE_ADD, expr, Sequel.lit(["INTERVAL ", " "], value, sql_unit))
101:             end
102:           when :mssql, :h2, :access, :sqlanywhere
103:             units = case db_type
104:             when :mssql, :sqlanywhere
105:               MSSQL_DURATION_UNITS
106:             when :h2
107:               H2_DURATION_UNITS
108:             when :access
109:               ACCESS_DURATION_UNITS
110:             end
111:             each_valid_interval_unit(h, units) do |value, sql_unit|
112:               expr = Sequel.function(:DATEADD, sql_unit, value, expr)
113:             end
114:           when :derby
115:             if expr.is_a?(Date) && !expr.is_a?(DateTime)
116:               # Work around for https://issues.apache.org/jira/browse/DERBY-896
117:               expr = Sequel.cast_string(expr) + ' 00:00:00'
118:             end
119:             each_valid_interval_unit(h, DERBY_DURATION_UNITS) do |value, sql_unit|
120:               expr = Sequel.lit(["{fn timestampadd(#{sql_unit}, ", ", timestamp(", "))}"], value, expr)
121:             end
122:           when :oracle
123:             each_valid_interval_unit(h, MYSQL_DURATION_UNITS) do |value, sql_unit|
124:               expr = Sequel.+(expr, Sequel.lit(["INTERVAL ", " "], value.to_s, sql_unit))
125:             end
126:           when :db2
127:             expr = Sequel.cast(expr, Time)
128:             each_valid_interval_unit(h, DB2_DURATION_UNITS) do |value, sql_unit|
129:               expr = Sequel.+(expr, Sequel.lit(["", " "], value, sql_unit))
130:             end
131:             false
132:           else
133:             raise Error, "date arithmetic is not implemented on #{db.database_type}"
134:           end
135: 
136:           if cast
137:             expr = Sequel.cast(expr, Time)
138:           end
139: 
140:           literal_append(sql, expr)
141:         end

[Validate]