David,

You're not thinking it through: It's about 11:00 on Friday 1 May here in 
California but it's 03:00 on Saturday 2 May in Western Australia. Chopping off 
the time doesn't solve anything, a point illustrated by Finfort when he pointed 
out that just changing the time on the errant dates would put them in the wrong 
day.

Regards,
John Ralls




> On Apr 30, 2020, at 10:24 PM, D. <sunfis...@yahoo.com> wrote:
> 
> Thanks for the reply. I do understand the challenges this poses-- both from 
> the perspective of managing it on a daily basis, and from that of the 
> difficulty of changing the underlying system. At least, conceptually!
> 
> Is there any option to simply ignore the time portion in these timestamps? It 
> would seem to me that one could focus on that, and simplify the process piece 
> by piece. Of course, not being a programmer, I'm just a silly voice in the 
> wilderness.
> 
> David
> 
> 
> -------- Original Message --------
> From: John Ralls <jra...@ceridwen.us>
> Sent: Fri May 01 10:32:09 GMT+05:30 2020
> To: "D." <sunfis...@yahoo.com>
> Cc: "finf...@gmail.com" <finf...@gmail.com>, "D. via gnucash-user" 
> <gnucash-user@gnucash.org>
> Subject: Re: [GNC] Working with dates in Postgresql DB
> 
> David,
> 
> I don't know why the decision was made to use time, it was taken long before 
> I joined the project, but it probably has to do with that being the way 
> computers keep time, in UTC and the accompanying date-time manipulation 
> functions in the C standard library were readily available. Over the years 
> various developers have piled more manipulation functions on top of it, or 
> added other libraries to the side because they made doing something easier, 
> and splattered it all over the code so that changing the base design would 
> involve chasing down and reworking all of those disparate functions. As I 
> said, no one has expressed much enthusiasm for taking it on.
> 
> Knowing now that using time instead of date was a poor decision is just 
> applying 20/20 hindsight to criticize Linas's decision 22 years ago. It can't 
> change it. I can't say that I would have decided differently.
> 
> Regards,
> John Ralls
> 
> 
>> On Apr 30, 2020, at 8:46 PM, D. <sunfis...@yahoo.com> wrote:
>> 
>> John,
>> 
>> I somewhat remember the discussion back in 2011 about the timestamp, but do 
>> not recall all the details. Remind me why it is that GnuCash uses timestamps 
>> in these date fields? All these steps and workarounds that take place to 
>> present the proper date around the world.
>> 
>> Wouldn't it be simpler just to store a bare date?
>> 
>> Or just ignore the time portion and drop the conversion between UTC and 
>> locale time altogether?
>> 
>> Everyone refers to them as dates ("transaction date" "invoice date" "posting 
>> date"). The software arbitrarily uses the same time for everything in a 
>> futile attempt to properly display dates for all timezones (the solution in 
>> this thread underscores that fact, insofar as you are recommending the user 
>> to arbitrarily change all other times to the "standard").
>> 
>> Of what use is it to store the added detail of an arbitrary timestamp in a 
>> field that is treated everywhere as a date? What is gained?
>> 
>> David T.
>> 
>> 
>> -------- Original Message --------
>> From: John Ralls <jra...@ceridwen.us>
>> Sent: Fri May 01 00:48:57 GMT+05:30 2020
>> To: "finf...@gmail.com" <finf...@gmail.com>
>> Cc: Gnucash Users <gnucash-user@gnucash.org>
>> Subject: Re: [GNC] Working with dates in Postgresql DB
>> 
>> GnuCash stores all dates as UTC but displays them as local, applying the 
>> timezone rules for the date, not for today. So in EEST 2020-02-12 22:00:00 
>> displays as 2020-02-13, 2020-06-12 21:00:00 displays as 2020-06-13, but 
>> 2020-02-21 21:00:00 displays as 2020-02-21.
>> 
>> Regards,
>> John Ralls
>> 
>> 
>>> On Apr 30, 2020, at 11:42 AM, finf...@gmail.com wrote:
>>> 
>>> It is not just adding one day, it depends on the time.
>>> 
>>> Looks like time 00:00:00 is the same date, not next.
>>> 
>>> From 21:00:00 is the next date in most cases, but I did not check all 
>>> transactions manually =)
>>> 
>>> How the program converts this wrong dates to the correct ones in its GUI?
>>> 
>>> I believe I have found a correct way to convert all the dates including 
>>> wrong ones to correct dates in Postgresql (pgAdmin 4):
>>> 
>>> 
>>> date(t.post_date AT TIME ZONE 'UTC' AT TIME ZONE 'EEST') AS 
>>> DATE_AT_timezone_EEST
>>> 
>>> EEST is a correct zone in my case. CEST does not work.
>>> 
>>> The transactions.post_date type is timestamp without timezone: 2017-12-31 
>>> 21:00:00
>>> 
>>> t.post_date AT TIME ZONE 'EEST' AS timestamp_AT_timezone_EEST gives 
>>> 2017-12-31 21:00:00+3
>>> 
>>> date(t.post_date AT TIME ZONE 'UTC' AT TIME ZONE 'EEST') AS 
>>> DATE_AT_timezone_EEST gives 2018-01-01
>>> 
>>> Looks strange but works.
>>> 
>>> 2.
>>> 
>>> There are only 3 transactions with 22:00:00 not connected with invoices.
>>> 
>>> There is only 1 transaction with 21:00:00 not connected with invoices.
>>> 
>>> Thinking how to find them...
>>> 
>>> 
>>> 
>>> On 30/04/2020 21:25, John Ralls wrote:
>>>> Hmm, true. Should be always, since you're in a time zone east of the prime 
>>>> meridian. So you also want to increment the day on those. I think it would 
>>>> be safest to do it in two queries, the first one being
>>>> 
>>>> update transactions post_date = post_date + interval '1 day' where 
>>>> post_date::TIME != '10:59:00';
>>>> 
>>>> and the second to update the time as before.
>>>> 
>>>> Regards,
>>>> John Ralls
>>>> 
>>>> 
>>>>> On Apr 30, 2020, at 11:07 AM, Finfort <finf...@gmail.com> wrote:
>>>>> 
>>>>> If post_date is 2017-12-31 22:00 or 23:00, it means (sometimes?) the real 
>>>>> date is 2018-01-01. At least in cases where I manually checked the 
>>>>> invoices.
>>>>> Setting all times to 10:59:00 will give wrong dates in the program.
>>>>> Now they are displayed correctly in the program somehow...
>>>>> 
>>>>> 
>>>>> 
>>>>>> On Apr 30, 2020 at 20:59, <John Ralls> wrote:
>>>>>> 
>>>>>> I don't think that's necessary.
>>>>>> 
>>>>>> To fix the wrong times just do an update query, something like
>>>>>> 
>>>>>> update transactions set post_date::TIME = 10:59:00 where post_date::TIME 
>>>>>> != 10:59:00;
>>>>>> 
>>>>>> I don't know Postgresql's date-time functions well enough to know if 
>>>>>> that syntax works, you might have to adjust it a bit. You might create a 
>>>>>> table with a DATETIME column and put a couple of rows in it to test 
>>>>>> against while you tweak. Make sure that GnuCash isn't connected to the 
>>>>>> database when you run that.
>>>>>> 
>>>>>> Regards,
>>>>>> John Ralls
>>>>>> 
>>>>>> 
>>>>>>> On Apr 30, 2020, at 10:45 AM, Finfort <finf...@gmail.com> wrote:
>>>>>>> How can I help?
>>>>>>> I can send you my gnucash file if it helps to find all the bugs.
>>>>>>> And how can I change now my wrong dates in transactions?
>>>>>>> 
>>>>>>>> On Apr 30, 2020 at 20:41, <John Ralls> wrote:
>>>>>>>> Yeah, it's definitely a bug. I easily found the wrong code and I'll 
>>>>>>>> fix it for 3.903 and 3.11.
>>>>>>>> The query actually accounts for only 543 of the 547 wrong times, so 
>>>>>>>> there's another error somewhere else.
>>>>>>>> Regards,
>>>>>>>> John Ralls
>>>>>>>> 
>>>>>>>>> On Apr 30, 2020, at 10:27 AM, Finfort <finf...@gmail.com> wrote:
>>>>>>>>> Also I tried to unpost and post again. No changes.
>>>>>>>>> 
>>>>>>>>>> On Apr 30, 2020 at 19:44, <Finfort> wrote:
>>>>>>>>>> Hi John,
>>>>>>>>>> The result is:
>>>>>>>>>> 22:00:00   253
>>>>>>>>>> 00:00:00   18
>>>>>>>>>> 21:00:00   250
>>>>>>>>>> 23:00:00   22
>>>>>>>>>> So wrong dates are only when I use invoices.
>>>>>>>>>>       On 29/04/2020 23:56, John Ralls wrote:
>>>>>>>>>>> Please remember to copy the list on all replies.
>>>>>>>>>>> 
>>>>>>>>>>> I take it that that means that you do in fact use the business 
>>>>>>>>>>> invoice features. Let's see if that's the source of the problem. 
>>>>>>>>>>> Run this query:
>>>>>>>>>>> 
>>>>>>>>>>> select t.post_date::TIME count(t.post_date::TIME) from transactions 
>>>>>>>>>>> as t inner join invoices as i on i.post_txn = t.guid group by 
>>>>>>>>>>> t.post_date::TIME;
>>>>>>>>>>> 
>>>>>>>>>>> Regards,
>>>>>>>>>>> John Ralls
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> On Apr 29, 2020, at 1:41 PM, Finfort <finf...@gmail.com> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> But the program use business features like entering invoices or 
>>>>>>>>>>>> bills.
>>>>>>>>>>>> And we have this mess.
>>>>>>>>>>>> How we can manage that?
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>>> On Apr 29, 2020 at 23:23, <John Ralls> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Dimon,
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I'm in Silicon Valley, so 10 hours behind you.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> By "simple invoices" do you mean that some of the transactions 
>>>>>>>>>>>>> are created using business invoices?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> My book goes back to 1993 and entry_dates begin in 2001. We 
>>>>>>>>>>>>> changed the transaction time from local midnight in early 2011 so 
>>>>>>>>>>>>> `select distinct time(post_date) from transactions;` returns
>>>>>>>>>>>>> 10:59:00
>>>>>>>>>>>>> 07:00:00
>>>>>>>>>>>>> 
>>>>>>>>>>>>> If I say instead `select distinct time(post_date) from 
>>>>>>>>>>>>> transactions where post_date > '2011-01-01';` I just get 10:59:00.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> But I don't use the business features, so if that's the problem 
>>>>>>>>>>>>> my book won't show it.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>> John Ralls
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On Apr 29, 2020, at 10:13 AM, Finfort <finf...@gmail.com> wrote:
>>>>>>>>>>>>>>    Hi John!
>>>>>>>>>>>>>> You are here finally!
>>>>>>>>>>>>>> Waiting for you all the day :)
>>>>>>>>>>>>>>    All my data I have entered inside Gnucash 3.7,  Ubuntu. No 
>>>>>>>>>>>>>> imports! Scheduled are ok!
>>>>>>>>>>>>>> Just simple invoices inside the program!
>>>>>>>>>>>>>> The SQL type conversions inside Postgres give better results 
>>>>>>>>>>>>>> with 22:00 but 21:00 show the same date again even in April - 
>>>>>>>>>>>>>> summer time where is for example 2018-06-04 21:00:00+03.
>>>>>>>>>>>>>> 22:00+02 is 00:00 of the next day, 21:00+03 (summer time) is 
>>>>>>>>>>>>>> 00:00 of the next day but conversion does not work...
>>>>>>>>>>>>>> So, maybe you could try this SQL to check your records and 
>>>>>>>>>>>>>> revise the procedure which posts the data to DB?
>>>>>>>>>>>>>>    Thank you,
>>>>>>>>>>>>>> Dimon.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> On Apr 29, 2020 at 19:50, <John Ralls> wrote:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> On Apr 29, 2020, at 2:18 AM, finf...@gmail.com wrote:
>>>>>>>>>>>>>>>>     Dear John,
>>>>>>>>>>>>>>>>     Thank you  for your response.
>>>>>>>>>>>>>>>>            I have collected some statistics from my DB.
>>>>>>>>>>>>>>>>     My DB has 1724 records - transactions.
>>>>>>>>>>>>>>>>     This is my SQL query, it is pretty simple and shows all 
>>>>>>>>>>>>>>>> the combinations of times in posted_date timestamps in 
>>>>>>>>>>>>>>>> transactions table, number of repetitions for that time value, 
>>>>>>>>>>>>>>>> min enter_date, max enter_date:
>>>>>>>>>>>>>>>>     SELECT
>>>>>>>>>>>>>>>>    t.post_date::TIME as "POST TIME",
>>>>>>>>>>>>>>>>    COUNT(t.post_date::TIME) as "REPS",
>>>>>>>>>>>>>>>>    min(t.enter_date) as "MIN ENTER DATE",
>>>>>>>>>>>>>>>>    max(t.enter_date) as "MAX ENTER DATE"
>>>>>>>>>>>>>>>> FROM transactions t
>>>>>>>>>>>>>>>> GROUP BY t.post_date::TIME
>>>>>>>>>>>>>>>> ORDER BY t.post_date::TIME
>>>>>>>>>>>>>>>>     Here are the results:
>>>>>>>>>>>>>>>>     ----
>>>>>>>>>>>>>>>>     POST TIME   REPS      MIN ENTER DATE             MAX ENTER 
>>>>>>>>>>>>>>>> DATE
>>>>>>>>>>>>>>>>     "00:00:00"    18        "2020-01-26 18:07:14"    
>>>>>>>>>>>>>>>> "2020-01-28 19:11:07"
>>>>>>>>>>>>>>>> "10:59:00"    1177    "2019-12-23 17:55:29"    "2020-04-23 
>>>>>>>>>>>>>>>> 11:24:24"
>>>>>>>>>>>>>>>> "21:00:00"    251      "2020-01-08 17:43:54"    "2020-04-23 
>>>>>>>>>>>>>>>> 10:36:33"
>>>>>>>>>>>>>>>> "22:00:00"    256      "2020-01-08 17:06:59"    "2020-04-23 
>>>>>>>>>>>>>>>> 11:24:08"
>>>>>>>>>>>>>>>> "23:00:00"    22        "2020-01-27 19:16:04"    "2020-01-28 
>>>>>>>>>>>>>>>> 19:39:49"
>>>>>>>>>>>>>>>>     ----
>>>>>>>>>>>>>>>>     I live in Cyprus, here is UTC +2 and summer time UTC +3, 
>>>>>>>>>>>>>>>> as I know.
>>>>>>>>>>>>>>>>     I started to study Gnucash in December 2019 and have 
>>>>>>>>>>>>>>>> entered my data of 2016-2020.
>>>>>>>>>>>>>>>>     I never changed my place and time zone in the period of 
>>>>>>>>>>>>>>>> working with Gnucash.
>>>>>>>>>>>>>>>>            1. Most of the records have time in date_posted 
>>>>>>>>>>>>>>>> 10:59:00 for all the period of data entering.
>>>>>>>>>>>>>>>>     2. Only 2 days of entering have the results of 00:00:00 - 
>>>>>>>>>>>>>>>> 18 records.
>>>>>>>>>>>>>>>>     3. Only 2 days of entering have the results of 23:00:00 - 
>>>>>>>>>>>>>>>> 22 records.
>>>>>>>>>>>>>>>>     4. 21:00:00 and 22:00:00 - 500+ records - 30% of 
>>>>>>>>>>>>>>>> transactions for all the period of data entering.
>>>>>>>>>>>>>>>>            Can you please explain that?
>>>>>>>>>>>>>>>>     Why I have so many different time stamps? When and why the 
>>>>>>>>>>>>>>>> system decides to write time different from 10:59:00?
>>>>>>>>>>>>>>>>     I understand that the system writes real ENTERING date and 
>>>>>>>>>>>>>>>> time and it is reasonable to use the time zone somehow.
>>>>>>>>>>>>>>>>     When I POST the document with exact date in it I suppose 
>>>>>>>>>>>>>>>> to see this POST DATE the same wherever in Cyprus or UK or 
>>>>>>>>>>>>>>>> USA. But entering the same date I can have 5 different 
>>>>>>>>>>>>>>>> results. How it works and what is the reason - I have no 
>>>>>>>>>>>>>>>> idea...
>>>>>>>>>>>>>>>>     Maybe you can give some examples and the algorithm to 
>>>>>>>>>>>>>>>> convert these dates? Where else I have to convert dates?
>>>>>>>>>>>>>>>    As those are all posted dates you've found a bug or two as 
>>>>>>>>>>>>>>> posted date should always have a 10:59:00 timestamp. The 21:00 
>>>>>>>>>>>>>>> and 22:00 times are clearly midnight local, and which one is 
>>>>>>>>>>>>>>> used *should* be determined by whether DST is in effect for the 
>>>>>>>>>>>>>>> posted date in your locale. It seems that 40 transactions 
>>>>>>>>>>>>>>> somehow used UK time instead of Cypress time.
>>>>>>>>>>>>>>>    Did you enter all of the transactions from the GnuCash UI or 
>>>>>>>>>>>>>>> did you import some of them? If you imported some is there any 
>>>>>>>>>>>>>>> way to tell which were imported (and from where and by what 
>>>>>>>>>>>>>>> method), perhaps by the accounts their splits are in or because 
>>>>>>>>>>>>>>> you still have some of the import files?
>>>>>>>>>>>>>>>    Were any of them created by scheduled transactions?
>>>>>>>>>>>>>>>    Regards,
>>>>>>>>>>>>>>> John Ralls
>>>>>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>> 
>> _______________________________________________
>> gnucash-user mailing list
>> gnucash-user@gnucash.org
>> To update your subscription preferences or to unsubscribe:
>> https://lists.gnucash.org/mailman/listinfo/gnucash-user
>> If you are using Nabble or Gmane, please see 
>> https://wiki.gnucash.org/wiki/Mailing_Lists for more information.
>> -----
>> Please remember to CC this list on all your replies.
>> You can do this by using Reply-To-List or Reply-All.
>> 
> 
> 

_______________________________________________
gnucash-user mailing list
gnucash-user@gnucash.org
To update your subscription preferences or to unsubscribe:
https://lists.gnucash.org/mailman/listinfo/gnucash-user
If you are using Nabble or Gmane, please see 
https://wiki.gnucash.org/wiki/Mailing_Lists for more information.
-----
Please remember to CC this list on all your replies.
You can do this by using Reply-To-List or Reply-All.

Reply via email to