Hi, Is there a way in bean-query to specify custom rate ranges e.g "last 30 days". I tried to that with the following query, but get the following error:
beancount> select * where (today() - date) < 30 limit 1 Traceback (most recent call last): File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/cmd.py", line 214, in onecmd func = getattr(self, 'do_' + cmd) AttributeError: 'BQLShell' object has no attribute 'do_select' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.7/site-packages/beancount/query/shell.py", line 270, in run_parser self.dispatch(statement) File "/usr/local/lib/python3.7/site-packages/beancount/query/shell.py", line 250, in dispatch return method(statement) File "/usr/local/lib/python3.7/site-packages/beancount/query/shell.py", line 418, in on_Select self.options_map) File "/usr/local/lib/python3.7/site-packages/beancount/query/query_execute.py", line 275, in execute_query if c_where is None or c_where(context): File "/usr/local/lib/python3.7/site-packages/beancount/query/query_compile.py", line 121, in __call__ return self.operator(self.left(context), self.right(context)) File "/usr/local/lib/python3.7/site-packages/beancount/query/query_compile.py", line 121, in __call__ return self.operator(self.left(context), self.right(context)) File "/usr/local/lib/python3.7/site-packages/beancount/query/query_compile.py", line 213, in <lambda> f = lambda x, y: Decimal(x - y) TypeError: conversion from datetime.timedelta to Decimal is not supported I understand what's going on, I think. The EvalSub function in query_compile.py assumes the result to be Decimal, when "<date> - <date>" results in datetime.timedelta class EvalSub(EvalBinaryOp): def __init__(self, left, right): f = lambda x, y: Decimal(x - y) super().__init__(f, left, right, Decimal) Do you know if there is already any way to write queries of this type? This will be super useful is writing queries in the main beancount file (using the query directive) without needing to adjust the date directives every time. If there isn't, I wonder if we can implement such a feature. The way I see it, since beancount quantizes time by the day, I feel like these functions are easily defined: - "<date> - <date>" should return the days. For example, '2018-01-01' - '2017-01-01' = 365 etc. - "<date> +/- <int> should add/subtract days from the date. For example, '2018-01-01' + 1 = '2018-01-02' etc. I see two ways of actually implementing it: 1. Add checks for the types of input to EvalSub/EvalMul etc methods in query_compile.py. If both the first and second is date parameter for EvalSub, extract the days from the result (<timedelta>.days); Else if the first or second argument is of type date, convert the non-date param to a timedelta(days=<value>). 2. Add new "simple functions" to the bean-query shell in query_shell.py. They can be called date_diff(date, date) and date_adjust(date, int) - or whatever else you feel works better. This is probably cleaner and easier. Also, I can certainly help implement this if you need. Thanks -- You received this message because you are subscribed to the Google Groups "Beancount" group. To unsubscribe from this group and stop receiving emails from it, send an email to beancount+unsubscr...@googlegroups.com. To post to this group, send email to beancount@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/beancount/f04a7d37-066d-4148-88e8-0cf0a5291118%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.