`toUnixTimestamp64*()` functions treat milli-, micro- and nanoseconds in a wrong way when timestamp is negative, for example:

```sql
SELECT toUnixTimestamp64Milli(toDateTime64('1927-01-01 00:00:00', 0, 'Europe/Zurich'))

┌─toUnixTimestamp64Milli(toDateTime64('1927-01-01 00:00:00', 0, 'Europe/Zurich'))─┐
│                                                                  -1357002000000 │
└─────────────────────────────────────────────────────────────────────────────────┘


SELECT toUnixTimestamp64Milli(toDateTime64('1927-01-01 00:00:00.123', 3, 'Europe/Zurich'))

┌─toUnixTimestamp64Milli(toDateTime64('1927-01-01 00:00:00.123', 3, 'Europe/Zurich'))─┐
│                                                                      -1357002000123 │
└─────────────────────────────────────────────────────────────────────────────────────┘
```
(In the case above, the first timestamp must be less than the second)

Comparison doesn't work properly either:

```sql
SELECT toDateTime64('1969-12-12 12:12:12.13', 2) > toDateTime64('1969-12-12 12:12:12.12', 2)

┌─greater(toDateTime64('1969-12-12 12:12:12.13', 2), toDateTime64('1969-12-12 12:12:12.12', 2))─┐
│                                                                                             0 │
└───────────────────────────────────────────────────────────────────────────────────────────────┘

SELECT toDateTime64('1979-12-12 12:12:12.13', 2) > toDateTime64('1979-12-12 12:12:12.12', 2)

┌─greater(toDateTime64('1979-12-12 12:12:12.13', 2), toDateTime64('1979-12-12 12:12:12.12', 2))─┐
│                                                                                             1 │
└───────────────────────────────────────────────────────────────────────────────────────────────┘
```

ClickHouse version 22.2.2.1
const auto scale_multiplier = DecimalUtils::scaleMultiplier<DateTime64::NativeType>(scale);
            ++components.whole;
            if (components.whole)
            {
                
                components.fractional = scale_multiplier - components.fractional;
            }
            else
            {
                
                components.fractional = components.fractional - scale_multiplier;
            }
        }
    }
    
    else if (whole >= 9908870400LL)
    {
        
        
        components.fractional =  components.whole % common::exp10_i32(scale);
        components.whole = components.whole / common::exp10_i32(scale);
    }
    datetime64 = DecimalUtils::decimalFromComponents<DateTime64>(components, scale);
    return ReturnType(true);
}
inline void readDateTimeText(time_t & datetime, ReadBuffer & buf, const DateLUTImpl & time_zone = DateLUT::instance())
{
    readDateTimeTextImpl<void>(datetime, buf, time_zone);
}
inline void readDateTime64Text(DateTime64 & datetime64, UInt32 scale, ReadBuffer & buf, const DateLUTImpl & date_lut = DateLUT::instance())