I think you were on the right track. I think naming the field "from" might have been a problem. I assume with your last function you had renamed the fields from_date and to_date? The if request.function might not be necessary. Remember that any functions with parameters cannot be accessed from the browser.
This works OK: db.define_table('duration', Field('start', 'datetime'), Field('end', 'datetime')) def process_duration_form(form): if form.vars.start > form.vars.end: form.errors.start = 'start must be before end' def duration(): form = SQLFORM(db.duration) if form.accepts(request.vars, session, onvalidation=process_duration_form): response.flash = 'form accepted' elif form.errors: response.flash = 'form has errors' else: response.flash = 'please fill out the form' return dict(form=form)