On Thu, 10 Nov 2011, Ron Pinkas wrote:

Hi Ron,

> Could you please help us review and consider synch issues of
> DATETIME support between Harboiur and xHarbour?

There were some deeper modifications in this are in xHarbour
recently. I'll look at it. Initial datetime implementation in
xHarbour was really interesting and good peace of code but it
introduce some incompatibilities to Clipper and needed some
minor code cleanup. Anyhow it was not precisely defined how
it should work. Now it's the most important problem in keeping
this code alive. It's hard to cleanup anomalies when programmer
does not know expected behavior. If you agree then I can add
support for Harbour like datetime arithmetics to HVM code and
update some vital part of core code. Anyhow it's not fully
compastible with current xHarbour behavior. There were two most
importatn differences betwen Harbour and xHarbour:
1. initial date value which can be seen in this code:
      proc main()
         set date format to "yyyy/mm/dd"
         ? {^ 02:00 }
      return

   Harbour shows:
          /  /   02:00:00.000
   xHarbour:
      1899/12/30 02:00:00.000
   This difference is important in code exchanging data with OLE
   servers so OLE interface has to be updated to keep it.

2. Separate type for date values when non integer number is
   aded to date item.
   As I can see current xHarbour SVN works like Harbour so this
   difference does not longer exists but I'm not sure if other
   code which needed such behavior had been updated.

I can add Harbour like TIMESTAMP values and update most important
parts of core non HVM code but I'm afraid I cannot make it for whole
xHarbour code. I hope that other developers can adopt their code if
necessary. As I can see in some places there is also code borrowed
from Harbour which will begin to work correctly when I'll update HVM
anyhow I cannot promise that I'll update whole xHarbour code to fully
respect new timestamp values.
Below I'm attaching small text I created to describe differences
between Harbour and xHarbour. Recent modifications in xHarbour HVM
changed xHarbour behavior so now it does not well describes it.
Anyhow it's still good description of TIMESTAMP values in Harbour
If you can accept it then I'll commit modification which introduce
it to xHarbour.

best regards,
Przemek




###    DATETIME/TIMESTAMP VALUES    ###
=======================================
Both compilers support DATETIME/TIMESTAMP values though they use different
implementation.

In Harbour it's new type TIMESTAMP for which VALTYPE() function returns
"T". It has its own HVM arithmetic similar to the one used by DATE type
but not exactly the same. The difference (-) between two TIMESTAMP values
is represented as number where integer part is number of days and fractional
part is time in given day. Non-exact comparison (=, >, <, >=, <=) for
TIMESTAMP and DATA value assumes that both values are equal if the date
part is the same. Such semantic is also respected by native RDDs when
mixed DATE and TIMESTAMP values are used in indexes, seeks, scopes, etc.
When number is added to DATE type then like in Clipper only integer part
increase (decrease) DATE value but when it's added to TIMESTAMP value then
fractional part is also significant. When TIMESTAMP value is added to DATE
value then as result new TIMESTAMP value is calculated. Here is detail
information about relational and arithmetic operators in Harbour.
Timestamp values in relational operators <, <=, >, >=, =, ==
      - When two timestamp values are compared then VM compares date and
        time parts in both values.
      - When date and timestamp values are used in <, <=, >, >=, =
        operations then VM compares only date part in both values.
      - When date and timestamp values are used in == operation then VM
        compares date part in both values and then check if time part
        of timestamp value is 0.
Timestamp values in + and - math operations:
      <t> + <t> => <t>
      <t> - <t> => <n>
      <t> + <n> => <t>
      <n> + <t> => <t>
      <t> - <n> => <t>
      <d> + <t> => <t>
      <t> + <d> => <t>
      <d> - <t> => <n>
      <t> - <d> => <n>
   when number is result or argument of timestamp operation then its integer
   part is a number of days and fractional part represents time in day.

In xHarbour DATE type was extended to hold information about time. Clipper
compatible DATE arithmetic in HVM was modified to respect fractional part
in numbers which was used for time part.
The xHarbour DATETIME implementation introduces incompatibilities to Clipper
(f.e. compare Clipper and xHarbour results in code like: '? date() + 1.125'
so in some cases existing Clipper code has to be carefully adopted to work
correctly with xHarbour but it's fully functional solution though it needs
some minor fixes in conversions between datetime values and numbers.

The difference between Harbour and xHarbour can be seen in this code:
      proc main()
         local dVal, tVal
         dVal := date()
         tVal := dVal + {^ 02:00 }  // {^ 02:00 } timestamp
                                    // constant, see below
         ? valtype(dVal), valtype(tVal)
         ? dVal; ? tVal
         dVal += 1.125  // In Clipper and Harbour it increases
                        // date value by 1
         tVal += 1.25   // it it increases timestamp value by 1 day
                        // and 6 hours
         ? dVal; ? tVal
         ? dVal = tVal  // In Harbour .T. because date part is the same
         ? date() + 0.25, date() + 0.001 == date()
      return
Harbour shows:
      D T
      05/20/09
      05/20/09 02:00:00.000
      05/21/09
      05/21/09 08:00:00.000
      .T.
      05/20/09 .T.

and xHarbour shows:
      D D
      05/20/09
      06/25/21 02:00:00.00
      05/21/09 03:00:00.00
      06/26/21 08:00:00.00
      .F.
      05/20/09 06:00:00.00 .F.

Recently to xHarbour "T" type was introduced with some of Harbour TIMESTAMP
code in RDD but VM was not modified to follow Harbour/RDD modifications.
So now some parts of xHarbour are not synced and I cannot say what is the
goal of DATETIME values and their arithmetic in xHarbour VM for the future.



###    LITERAL DATE AND TIMESTAMP VALUES    ###
===============================================
Both compilers tries to support VFP like datetime constant values
in the following format:
      { ^ [ YYYY-MM-DD [,] ] [ HH[:MM[:SS][.FFF]] [AM|PM] ] }
In Harbour and VFP the following characters can be used as date delimiters:
"-", "/" and "."
xHarbour supports only "/" as date delimiter.
There is no limit on number of digits in YYYY, MM, DD, HH, MM, SS, FFF
parts. Important is only their value. This is the format in semi PP notation:
      { ^ <YEAR> <sep:/-> <MONTH> <sep:/-> <DAY> [[<sep2:,>]
        [ <HOUR> [ : <MIN> [ : <SEC> [ . <FRAQ> ] ] ] [AM|PP] ] }
NOTE: there is one important difference between Harbour and VFP/xHarbour in
decoding above format. In VFP and xHarbour when date part is missed then
it's set by default to: 1899-12-30 so this code:
      { ^ 12:00 }
gives the same results as:
      { ^ 1899/12/30 12:00 }
Harbour does not set any default date value when timestamp constant contains
only time part.
Harbour supports VFP syntax only in Compiler. It's not supported in
macrocompiler and it can be disabled in the future so it's not suggested
to use with Harbour programs.

Only Harbour supports date constant (in compiler and macrocompiler) in the
form d"YYYY-MM-DD" f.e.:
      d"2009-05-20"
Also delimiter "/" or "." can be used instead of "-".

Only Harbour supports timestamp constant (in compiler and macrocompiler)
in the form t"YYYY-MM-DD HH:MM:SS.fff"
The exact accepted timestamp pattern is is:
      YYYY-MM-DD [H[H][:M[M][:S[S][.f[f[f[f]]]]]]] [PM|AM]
f.e.:
      tValue := t"2009-03-21 5:31:45.437 PM"
or:
      YYYY-MM-DDT[H[H][:M[M][:S[S][.f[f[f[f]]]]]]] [PM|AM]
with literal "T" as date and time part delimiters (XML timestamp format),
f.e.:
      tValue := t"2009-03-21T17:31:45.437"
The following characters can be used as date delimiters: "-", "/", "."
if PM or AM is used HH is in range < 1 : 12 > otherwise in range < 0 : 23 >

Harbour compiler and macrocompiler support also date constants in the
form 0dYYYYMMDD f.e.:
      0d20090520.

------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
xHarbour-developers mailing list
xHarbour-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xharbour-developers

Reply via email to