On Sep 21, 2010, at 3:00 PM, Dave Fowler wrote:
Hi,
I'm new to SQLAlchemy but I've read the entire oreilly book and done a
lot of googling and i've found that there is support for the generic
functions
current_date, current_time and current_timestamp
but i can find nothing for finding the year, or week of a date
column.
I need them in order to group results by week or year depending on the
user input.
Does current_year and current_week exist somewhere? And if not is
there a way to create your own custom functions based on Column
types? I've yet to run into any documentation on that processes
either.
The collection of functions that are truly generic is quite small right now.
Date arithmetic and calendar functions in particular vary dramatically in
their implementation across backends, and a comprehensive abstraction layer for
them would be a large undertaking with a lot of controversial points.
So for this use case the most straight ahead approach to building up a library
of date/calendar functions that you need is using the compiler extension, which
is at http://www.sqlalchemy.org/docs/core/compiler.html .
For example, my current app has to do some simple date math across Postgresql
and MS-SQL. So a function that calculates the length in days between two
dates looks like:
from sqlalchemy.sql import expression
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.types import Integer
class date_delta(expression.FunctionElement):
Calculate the timedelta in days between two dates.
type = Integer()
name = 'timedelta'
@compiles(date_delta, 'postgresql')
def _pg_date_delta(element, compiler, **kw):
return (%s::date - %s::date) % (
compiler.process(element.clauses.clauses[1]),
compiler.process(element.clauses.clauses[0]),
)
@compiles(date_delta, 'mssql')
def _ms_date_delta(element, compiler, **kw):
return DATEDIFF(day, %s, %s) % (
compiler.process(element.clauses.clauses[0], **kw),
compiler.process(element.clauses.clauses[1], **kw),
)
Where above, some inspection of the function object's .clauses member, called
a ClauseList, has the actual two arguments inside of a list called clauses.
Some minimal source perusal of expression.py may be needed for more involved
constructs but functions are pretty much in the above form.
--
You received this message because you are subscribed to the Google Groups
sqlalchemy group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.