Hello!

I've started to use `DateTime64` recently and faced the next issue with `toDate()`/`toDate32()` functions.

This query works fine:
```sql
SELECT toDate('2022-07-26 00:00:00')

Query id: bf64d8a8-018d-4b3e-ae24-f92600a1fa15

┌─toDate('2022-07-26 00:00:00')─┐
│                    2022-07-26 │
└───────────────────────────────┘

1 rows in set. Elapsed: 0.003 sec.
```

But when the string representation of the timestamp has the milliseconds fraction the function does not work:
```sql
SELECT toDate('2022-07-26 00:00:00.000')

Query id: 8b42473a-0ceb-4892-b0e7-6f73f583d4b4


0 rows in set. Elapsed: 0.006 sec.

Received exception from server (version 22.3.8):
Code: 6. DB::Exception: Received from s:9000. DB::Exception: Cannot parse string '2022-07-26 00:00:00.000' as Date: syntax error at position 10 (parsed just '2022-07-26'): While processing toDate('2022-07-26 00:00:00.000'). (CANNOT_PARSE_TEXT)
```

The `toDate32()` doesn't work in both cases.

Yes, you can say I must change the input or use a workaround like this:
```sql
SELECT toDate(toDateTime64('2022-07-26 00:00:00.000', 3, 'UTC')) AS date
```

But it's not convenient and it'd be great if the mentioned functions will ignore the time part.

P.s. ClickHouse server version: `22.3.8.39`

, MonotonicityForRange && monotonicity_for_range_
            , const DataTypes & argument_types_
            , const DataTypePtr & return_type_
            , std::optional<Diagnostic> diagnostic_
            , CastType cast_type_
            , bool cast_ipv4_ipv6_default_on_conversion_error_)
        : cast_name(cast_name_), monotonicity_for_range(std::move(monotonicity_for_range_))
        , argument_types(argument_types_), return_type(return_type_), diagnostic(std::move(diagnostic_))
        , cast_type(cast_type_)
        , cast_ipv4_ipv6_default_on_conversion_error(cast_ipv4_ipv6_default_on_conversion_error_)
    {
    }
    const DataTypes & getArgumentTypes() const override { return argument_types; }
    const DataTypePtr & getResultType() const override { return return_type; }
    ExecutableFunctionPtr prepare(const ColumnsWithTypeAndName & ) const override
    {
        try
        {
            return std::make_unique<ExecutableFunctionCast>(
                    prepareUnpackDictionaries(getArgumentTypes()[0], getResultType()), cast_name, diagnostic);
        }
        catch (Exception & e)
        {
            if (diagnostic)
                e.addMessage("while converting source column " + backQuoteIfNeed(diagnostic->column_from) +
                             " to destination column " + backQuoteIfNeed(diagnostic->column_to));
            throw;
        }
    }
    String getName() const override { return cast_name; }