Это литерал даты:
SET @myDate = '1000-01-01' -- WORKS
Но это не одно и то же, потому что выходные данные функции не могут быть литералом даты:
SET @date = CONCAT(CONCAT('0', @date), '0101')
Выможно попытаться обернуть это в CONVERT, но лучший подход был бы:
SET @date = DATEFROMPARTS(@yearyouwant,1,1)
Между тем в этом бите нет ничего плохого, не знаю, почему вы говорите, что он не работает:
DECLARE @myDate as Date
SET @myDate = '0999-01-01'
PRINT @myDate
НО в вашем скрипте есть @date дважды с разными типами, один раз как int и один раз как дата, так что это не сработает.
В целом, я думаю, вы хотите что-то вроде
DECLARE @myDate AS DATE
SET @myDate = '1983-09-07'
SELECT @myDate
DECLARE @yearValue AS int = YEAR(@myDate)
SELECT @yearValue
DECLARE @adjustedDate as DATE
SET @adjustedDate = DATEFROMPARTS(@yearValue,1,1)
SELECT DATEPART(dw, @adjustedDate)