# ActiveRecord (2.1.1) and time columns

**URL:** <https://www.ruby-forum.com/t/activerecord-2-1-1-and-time-columns/149062>\
**Category:** Rails\
**Created:** [September 19, 2008, 9:54pm UTC](https://www.ruby-forum.com/t/activerecord-2-1-1-and-time-columns/149062 "2008-09-19T21:54:16Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![jacib](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/da6949/32.png) [@jacib](https://www.ruby-forum.com/u/jacib)\
**Post date:** [September 19, 2008, 9:54pm UTC](https://www.ruby-forum.com/t/activerecord-2-1-1-and-time-columns/149062/1 "2008-09-19T21:54:16Z")

</div>

Hi all,

I’m building an application that will allow store owners to keep track  
of the opening and closing times of their shops. For example, a store  
owner might input that their shop is open Monday, Wednesday, and  
Friday from 9am to 5pm.

To keep track of these store hours, I’m using Store and Opening  
models, where each store has many openings.

The openings table looks like:  
id  
day (string – day of the week, in words)  
opens\_at (time)  
closes\_at (time)

It seems that ActiveRecord (2.1.1) insists on appending a bogus date  
to the time for inserts & queries. For example, for a named scope to  
allow quick searches for whether a store is opened for a given day &  
time, I have to use this:

named\_scope :open\_for, lambda { |day, time| { :conditions =\>[“day  
= ? AND opens\_at \<= ? AND closes\_at \>= ?”, day, "2001-00-01 " \<\<  
time.to\_s(:time) \<\< “:00”, "2000-01-01 " \<\< time.to\_s(:time) \<\< “:  
00” ] } }

when I would much prefer something like:

named\_scope :open\_for, lambda { |day, time| { :conditions =\>[“day  
= ? AND opens\_at \<= ? AND closes\_at \>= ?”, day, time, time] } }

Does anyone know of a way to handle time columns more elegantly?

best,

Jacob P.

---

<div class="post-metadata">

**Author:** ![jacib](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/da6949/32.png) [@jacib](https://www.ruby-forum.com/u/jacib)\
**Post date:** [September 21, 2008, 7:33am UTC](https://www.ruby-forum.com/t/activerecord-2-1-1-and-time-columns/149062/2 "2008-09-21T07:33:09Z")

</div>

ActiveRecord doesn’t have the concept of a time independent from a  
date, which is what it seems like you need. As far as I know, the Ruby  
standard library doesn’t either. I would use another data type. It  
looks like in your example the minute is always 0, so you could store  
only the hour in the database. If you need minute granularity, you  
could use a decimal data type and use 9.25 for 9:15am, 13.5 for 1:30  
pm, etc.

-Dan M.  
[http://www.dcmanges.com/blog](http://www.dcmanges.com/blog)

---

<div class="post-metadata">

**Author:** ![jacib](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/da6949/32.png) [@jacib](https://www.ruby-forum.com/u/jacib)\
**Post date:** [September 21, 2008, 11:45am UTC](https://www.ruby-forum.com/t/activerecord-2-1-1-and-time-columns/149062/3 "2008-09-21T11:45:23Z")

</div>

I don’t know about Ruby not having a Time object independent from  
DateTime, as migrations allow for both types of fields in a database  
and they behave differently.

I had a problem similar to yours where Rails insisted in updating Time  
fields with 1st Januray 2000 and it turned out that I was trying to  
input a Date Time value in a Time field (or something similar).

Try changing the type of the database field and see what happens.

---

<div class="post-metadata">

**Author:** ![jacib](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/da6949/32.png) [@jacib](https://www.ruby-forum.com/u/jacib)\
**Post date:** [October 9, 2008, 8:59am UTC](https://www.ruby-forum.com/t/activerecord-2-1-1-and-time-columns/149062/4 "2008-10-09T08:59:14Z")

</div>

On Sep 21, 2:17 pm, Frederick C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Ruby doesn’t have a pure time of day class. If you’re database have  
> time columns then what you get back is a Time object for 1st January  
> 2000 and the appropriate time.

Yes, that’s what it looks like from my end. I ultimately decided to  
leave in the date + time concatenation in my named scopes to handle  
databases with & without time columns.

(Sorry for the late post – I didn’t have a chance to post back before  
going on vacation.)

Jacob

---

<div class="post-metadata">

**Author:** ![jacib](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/da6949/32.png) [@jacib](https://www.ruby-forum.com/u/jacib)\
**Post date:** [September 21, 2008, 8:18pm UTC](https://www.ruby-forum.com/t/activerecord-2-1-1-and-time-columns/149062/5 "2008-09-21T20:18:22Z")

</div>

On 21 Sep 2008, at 10:45, Abel wrote:

> I don’t know about Ruby not having a Time object independent from  
> DateTime, as migrations allow for both types of fields in a database  
> and they behave differently.

Ruby doesn’t have a pure time of day class. If you’re database have  
time columns then what you get back is a Time object for 1st January  
2000 and the appropriate time.

Fred
