Class: OCI8::BindType::IntervalDS
- Inherits:
-
OCIIntervalDS
- Object
- OCIIntervalDS
- OCI8::BindType::IntervalDS
- Defined in:
- lib/oci8/datetime.rb
Overview
– OCI8::BindType::IntervalDS ++
(new in 2.0)
This is a helper class to select or bind Oracle data type INTERVAL DAY TO SECOND
. The retrieved value is the number of seconds between two typestamps as a Float.
Note that it is the number days as a Rational if OCI8::BindType::IntervalDS.unit is :day or the ruby-oci8 version is prior to 2.0.3.
How to bind INTERVAL DAY TO SECOND
You cannot bind a bind variable as INTERVAL DAY TO SECOND
implicitly. It must be bound explicitly by OCI8::Cursor#bind_param.
# output bind variable
cursor = conn.parse(<<-EOS)
BEGIN
:interval := (:ts1 - :ts2) DAY TO SECOND(9);
END;
EOS
cursor.bind_param(:interval, nil, :interval_ds)
cursor.bind_param(:ts1, DateTime.parse('1969-11-19 06:54:35 00:00'))
cursor.bind_param(:ts2, DateTime.parse('1969-07-20 20:17:40 00:00'))
cursor.exec
cursor[:interval] # => 10492615.0 seconds
cursor.close
# input bind variable
cursor = conn.parse(<<-EOS)
BEGIN
:ts1 := :ts2 + :interval;
END;
EOS
cursor.bind_param(:ts1, nil, DateTime)
cursor.bind_param(:ts2, DateTime.parse('1969-07-20 20:17:40 00:00'))
cursor.bind_param(:interval, 10492615.0, :interval_ds)
cursor.exec
cursor[:ts1].strftime('%Y-%m-%d %H:%M:%S') # => 1969-11-19 06:54:35
cursor.close
Constant Summary collapse
- @@hour =
1 / 24.to_r
- @@minute =
@@hour / 60
- @@sec =
@@minute / 60
- @@fsec =
@@sec / 1000000000
- @@unit =
:second
Class Method Summary collapse
-
.unit ⇒ Object
call-seq: OCI8::BindType::IntervalDS.unit -> :second or :day.
-
.unit=(val) ⇒ Object
call-seq: OCI8::BindType::IntervalDS.unit = :second or :day.
Instance Method Summary collapse
-
#get ⇒ Object
:nodoc:.
-
#set(val) ⇒ Object
:nodoc:.
Class Method Details
.unit ⇒ Object
call-seq:
OCI8::BindType::IntervalDS.unit -> :second or :day
(new in 2.0.3)
Retrieves the unit of interval.
547 548 549 |
# File 'lib/oci8/datetime.rb', line 547 def self.unit @@unit end |
.unit=(val) ⇒ Object
call-seq:
OCI8::BindType::IntervalDS.unit = :second or :day
(new in 2.0.3)
Changes the unit of interval. :second is the default.
557 558 559 560 561 562 563 564 |
# File 'lib/oci8/datetime.rb', line 557 def self.unit=(val) case val when :second, :day @@unit = val else raise 'unit should be :second or :day' end end |
Instance Method Details
#get ⇒ Object
:nodoc:
598 599 600 601 602 603 604 605 606 607 608 |
# File 'lib/oci8/datetime.rb', line 598 def get() # :nodoc: val = super() return nil if val.nil? day, hour, minute, sec, fsec = val if @@unit == :second fsec = fsec / 1000000000.0 day * 86400 + hour * 3600 + minute * 60 + sec + fsec else day + (hour * @@hour) + (minute * @@minute) + (sec * @@sec) + (fsec * @@fsec) end end |
#set(val) ⇒ Object
:nodoc:
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 |
# File 'lib/oci8/datetime.rb', line 566 def set(val) # :nodoc: unless val.nil? if val < 0 is_minus = true val = -val else is_minus = false end if @@unit == :second day, val = val.divmod 86400 hour, val = val.divmod 3600 minute, val = val.divmod 60 sec, val = val.divmod 1 else day, val = val.divmod 1 hour, val = (val * 24).divmod 1 minute, val = (val * 60).divmod 1 sec, val = (val * 60).divmod 1 end fsec, val = (val * 1000000000).divmod 1 if is_minus day = - day hour = - hour minute = - minute sec = - sec fsec = - fsec end val = [day, hour, minute, sec, fsec] end super(val) end |