# Date Comparison Problems

**URL:** <https://www.ruby-forum.com/t/date-comparison-problems/154018>\
**Category:** Rails\
**Created:** [November 24, 2008, 5:35pm UTC](https://www.ruby-forum.com/t/date-comparison-problems/154018 "2008-11-24T17:35:46Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![cam295](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/73ab20/32.png) [@cam295](https://www.ruby-forum.com/u/cam295)\
**Post date:** [November 24, 2008, 5:35pm UTC](https://www.ruby-forum.com/t/date-comparison-problems/154018/1 "2008-11-24T17:35:46Z")

</div>

I’m trying to compare two dates (one from a database, and the other is  
the current date). Here is the code I’m using:

* * *

```
if document.nil?
  "doc_none"
elsif document.status == 'archived'
  "doc_archived"
elsif document.expiration_on < 720.days.ago
  "doc_expired_720"
elsif document.expiration_on < 360.days.ago
  "doc_expired_360"
elsif document.expiration_on < 90.days.ago
  "doc_expired_90"
elsif document.expiration_on < 60.days.ago
  "doc_expired_60"
elsif document.expiration_on < 30.days.ago
  "doc_expired_30"
elsif document.expiration_on < 0.days.ago
  "doc_expired"
elsif document.expiration_on < 30.days.from.now
 "doc_expiring_30"
elsif document.expiration_on < 60.days.from.now
  "doc_expiring_60"
else
  "doc_current"
end

```

* * *

Here is the error in my log:

* * *

ActionView::TemplateError (comparison of Date with Time failed) on line  
#46 of app/views/admin/documents/list.rhtml:  
43:

  
44: \<%= link\_to  
document.expiration\_on.strftime("%Y.%m.%d"), :action =\> ‘show’, :id =\>  
document %\>  
45: \<%= link\_to\_organization(document.organization)  
%\>  
46:   
47: \<%=hh document.status\_readable  
%\>   
48: \<%= link\_to\_doctype(document.doctype) %\>  
49: \<%= link\_to document.service\_date.strftime("%Y.%m.%d"),  
:action =\> ‘show’, :id =\> document %\>

```
#{RAILS_ROOT}/app/helpers/organizations_helper.rb:12:in `<'
#{RAILS_ROOT}/app/helpers/organizations_helper.rb:12:in

```

## `expiration_class' #{RAILS_ROOT}/app/views/admin/documents/list.rhtml:46 #{RAILS_ROOT}/app/views/admin/documents/list.rhtml:42:in`each’ #{RAILS\_ROOT}/app/views/admin/documents/list.rhtml:42

It sounds like my dates aren’t in the same format, but I’m not sure what  
the solution is. I’m using mySQL, and the field that I’m grabbing the  
data from is of type “date”.

---

<div class="post-metadata">

**Author:** ![cam295](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/73ab20/32.png) [@cam295](https://www.ruby-forum.com/u/cam295)\
**Post date:** [November 24, 2008, 6:40pm UTC](https://www.ruby-forum.com/t/date-comparison-problems/154018/2 "2008-11-24T18:40:28Z")

</div>

On 24 Nov 2008, at 16:35, Charley M. wrote:

> ```
> "doc_expired_720"
> 
> ```
> 
> ## elsif document.expiration\_on \< 30.days.from.now “doc\_expiring\_30” elsif document.expiration\_on \< 60.days.from.now “doc\_expiring\_60” else “doc\_current” end

So ruby has several classes to do with dates and times.

- Time which is implemented as a number of seconds since an epoch  
(usually a 32bit which restricts the range of representable dates)
- Date which is a number of days (with all the niceties to do with  
Julian reform, Gregorian reform etc…)
- DateTime which is sort of like Date but which also has time of day  
info

date columns on the database comes back as instances of Date, but  
0.days.ago etc… will be instances of Time.  
You can convert these around with to\_date/to\_s.

I might write this as  
delta = Date.today - document.expiration\_on  
case delta  
when 720…360 then ‘doc\_expired\_360’  
when 360…90 then ‘doc\_expired\_90’

etc…

Fred

---

<div class="post-metadata">

**Author:** ![cam295](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/73ab20/32.png) [@cam295](https://www.ruby-forum.com/u/cam295)\
**Post date:** [November 24, 2008, 7:40pm UTC](https://www.ruby-forum.com/t/date-comparison-problems/154018/3 "2008-11-24T19:40:02Z")

</div>

I’ve written it as this:

* * *

def expiration\_class(document)

```
delta = Date.today - document.expiration_on

result = case delta
    when 720..360: "doc_expired_360"
    when 360..90: "doc_expired_90"
    when 90..60: "doc_expired_60"
    when 60..30: "doc_expired_30"
    when 30..1: "doc_expired"
    else 'doc_current'
end

```

## end end

The problem, though, is that it’s returning all deltas as “doc\_current”,  
when I know they’re not. Any ideas?

Frederick C. wrote:

> I might write this as  
> delta = Date.today - document.expiration\_on  
> case delta  
> when 720…360 then ‘doc\_expired\_360’  
> when 360…90 then ‘doc\_expired\_90’
> 
> etc…
> 
> Fred

---

<div class="post-metadata">

**Author:** ![cam295](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/73ab20/32.png) [@cam295](https://www.ruby-forum.com/u/cam295)\
**Post date:** [November 24, 2008, 7:47pm UTC](https://www.ruby-forum.com/t/date-comparison-problems/154018/4 "2008-11-24T19:47:31Z")

</div>

On 24 Nov 2008, at 18:40, Charley M. wrote:

> ```
> when 360..90: "doc_expired_90"
> 
> ```
> 
> The problem, though, is that it’s returning all deltas as  
> “doc\_current”,  
> when I know they’re not. Any ideas?

because your ranges are back to front. ranges must be  
smallest…largest (check whether you want … instead of … i never  
remember which is which)

Fred
