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

[Validate]