The SQL Server GETDATE() function returns the exact date and time as it at the time of execution including the seconds/milisecond i.e. 2020-07-24 14:08:40.670. When the query executes, the
evaluates the date/time as it at at the time of execution minus 3 days i.e. 2020-07-21 14:08:40.670 and thus only items with an f.Date greater then/equal to 2020-07-21 14:08:40.670 will be returned.
Using CONVERT with a Style of 101 on GETDATE() returns a date in the format of mm/dd/yyyy. In your example above of
CAST(CONVERT(VARCHAR(10),GETDATE() - 3,101) AS DATETIME)
CONVERT(VARCHAR(10),GETDATE() - 3,101)
evaluates the date/time as it at at the time of execution minus 3 days without any time portion i.e. 2020-07-21. When this is then CAST to a datetime the time portion is defaulted to 00:00:00 i.e. 2020-07-21 00:00:00.000.
As the derived expression in your second statement is earlier than that in the first you may have additional rows returned.