public static ClickHouseOffsetDateTimeValue of(ClickHouseValue ref, LocalDateTime value, int scale, TimeZone tz) {
        OffsetDateTime v = null;
        if (value != null) {
            v = value.atZone(
                    tz == null || tz.equals(ClickHouseValues.UTC_TIMEZONE) ? ClickHouseValues.UTC_ZONE : tz.toZoneId())
                    .toOffsetDateTime();
        }
        return ref instanceof ClickHouseOffsetDateTimeValue
                ? (ClickHouseOffsetDateTimeValue) ((ClickHouseOffsetDateTimeValue) ref).set(v)
                : new ClickHouseOffsetDateTimeValue(v, scale, tz);
    }
Update value of the given object or create a new instance if {@code ref} is
null.

@param ref   object to update, could be null
@param value value
@param scale scale, only used when {@code ref} is null
@param tz    time zone, null is treated as {@code UTC}
@return same object as {@code ref} or a new instance if it's null
clickhouse-data/src/main/java/com/clickhouse/data/value/ClickHouseOffsetDateTimeValue.java