**Describe the unexpected behaviour**

The `WITH FILL` modifier on an `ORDER BY` clause does not accept a negative
`INTERVAL` as a `STEP`, when the `ORDER BY` is applied to a `Date` column
and the order is `DESC`. This is unexpected because negative steps work
fine on numeric columns sorted in descending order.

**How to reproduce**

* Which ClickHouse server version to use

22.4.4.3

* Queries to run that lead to unexpected result

```sql
SELECT d
FROM
(
  SELECT toDate(1) AS d
)
ORDER BY d DESC WITH FILL FROM toDate(3) TO toDate(0) STEP INTERVAL -1 DAY
;
```

```
Received exception from server (version 22.4.4):
Code: 475. DB::Exception: Received from localhost:9000. DB::Exception: Value of step is to low (-86400 seconds). Must be >= 1 day. (INVALID_WITH_FILL_EXPRESSION)
```

**Expected behavior**

Like numeric columns, `Date` should also support negative steps.

```sql
SELECT n
FROM
(
    SELECT 1 AS n
)
ORDER BY n DESC WITH FILL FROM 3 TO 0 STEP -1

┌─n─┐
│ 3 │
│ 2 │
│ 1 │
└───┘
```

throw Exception("Incompatible types of WITH FILL expression values with column type "
                                + type->getName(), ErrorCodes::INVALID_WITH_FILL_EXPRESSION);
        if (type->isValueRepresentedByUnsignedInteger() &&
            ((!descr.fill_from.isNull() && less(descr.fill_from, Field{0}, 1)) ||
             (!descr.fill_to.isNull() && less(descr.fill_to, Field{0}, 1))))
        {
            throw Exception("WITH FILL bound values cannot be negative for unsigned type "
                                + type->getName(), ErrorCodes::INVALID_WITH_FILL_EXPRESSION);
        }
    }
    std::set<size_t> unique_positions;
    for (auto pos : fill_column_positions)
        if (!unique_positions.insert(pos).second)
            throw Exception("Multiple WITH FILL for identical expressions is not supported in ORDER BY", ErrorCodes::INVALID_WITH_FILL_EXPRESSION);
    size_t idx = 0;
    for (const ColumnWithTypeAndName & column : header_.getColumnsWithTypeAndName())
    {
        if (interpolate_description)
            if (const auto & p = interpolate_description->required_columns_map.find(column.name);
                p != interpolate_description->required_columns_map.end())
                    input_positions.emplace_back(idx, p->second);
        if (!is_fill_column[idx] && !(interpolate_description && interpolate_description->result_columns_set.contains(column.name)))
                other_column_positions.push_back(idx);
        ++idx;
    }
    if (interpolate_description)
        for (const auto & name : interpolate_description->result_columns_order)
            interpolate_column_positions.push_back(header_.getPositionByName(name));
}
IProcessor::Status FillingTransform::prepare()