Class: OCI8::BindType::IntervalDS

Inherits:
OCIIntervalDS
  • Object
show all
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

Instance Method Summary collapse

Class Method Details

.unitObject

call-seq:

OCI8::BindType::IntervalDS.unit -> :second or :day

(new in 2.0.3)

Retrieves the unit of interval.



562
563
564
# File 'lib/oci8/datetime.rb', line 562

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.



572
573
574
575
576
577
578
579
# File 'lib/oci8/datetime.rb', line 572

def self.unit=(val)
  case val
  when :second, :day
    @@unit = val
  else
    raise 'unit should be :second or :day'
  end
end

Instance Method Details

#getObject

:nodoc:



613
614
615
616
617
618
619
620
621
622
623
# File 'lib/oci8/datetime.rb', line 613

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:



581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
# File 'lib/oci8/datetime.rb', line 581

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