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

[Validate]