Django

Code

Changeset 2735

Show
Ignore:
Timestamp:
04/23/06 17:10:50 (3 years ago)
Author:
adrian
Message:

magic-removal: Fixed #1423 -- Improved implementation of get_date_trunc_sql() for MySQL backend. Thanks, Geert Vanderkelen

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/magic-removal/AUTHORS

    r2691 r2735  
    107107    Malcolm Tredinnick 
    108108    Amit Upadhyay 
     109    Geert Vanderkelen 
    109110    Milton Waddams 
    110111    Rachel Willmer <http://www.willmer.com/kb/> 
  • django/branches/magic-removal/django/db/backends/mysql/base.py

    r2732 r2735  
    125125def get_date_trunc_sql(lookup_type, field_name): 
    126126    # lookup_type is 'year', 'month', 'day' 
    127     # http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html 
    128     # MySQL doesn't support DATE_TRUNC, so we fake it by subtracting intervals. 
    129     # If you know of a better way to do this, please file a Django ticket. 
    130     # Note that we can't use DATE_FORMAT directly because that causes the output 
    131     # to be a string rather than a datetime object, and we need MySQL to return 
    132     # a date so that it's typecasted properly into a Python datetime object. 
    133     subtractions = ["interval (DATE_FORMAT(%s, '%%%%s')) second - interval (DATE_FORMAT(%s, '%%%%i')) minute - interval (DATE_FORMAT(%s, '%%%%H')) hour" % (field_name, field_name, field_name)] 
    134     if lookup_type in ('year', 'month'): 
    135         subtractions.append(" - interval (DATE_FORMAT(%s, '%%%%e')-1) day" % field_name) 
    136     if lookup_type == 'year': 
    137         subtractions.append(" - interval (DATE_FORMAT(%s, '%%%%m')-1) month" % field_name) 
    138     return "(%s - %s)" % (field_name, ''.join(subtractions)) 
     127    fields = ['year', 'month', 'day', 'hour', 'minute', 'second'] 
     128    format = ('%%Y-', '%%m', '-%%d', ' %%H:', '%%i', ':%%s') # Use double percents to escape. 
     129    format_def = ('0000-', '01', '-01', ' 00:', '00', ':00') 
     130    try: 
     131        i = fields.index(lookup_type) + 1 
     132    except ValueError: 
     133        sql = field_name 
     134    else: 
     135        format_str = ''.join([f for f in format[:i]] + [f for f in format_def[i:]]) 
     136        sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str) 
     137    return sql 
    139138 
    140139def get_limit_offset_sql(limit, offset=None):