| 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.
| 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 |
Append the SQL fragment for the DateAdd expression to the SQL query.
# 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: Sequel::Deprecation.deprecate('Sequel::NotImplemented', 'Sequel 4 will just raise Error if date_arithmetic is not supported on the database')
126: raise NotImplemented, "date arithmetic is not implemented on #{db.database_type}"
127: end
128:
129: if cast
130: expr = Sequel.cast(expr, Time)
131: end
132:
133: literal_append(sql, expr)
134: end