Поскольку в первый раз, когда вы запускали код, дата была сохранена внутренне как 12 января. Установленная настройка соответствует вашей сессии, затем вы запустили ее снова, чтобы вы переопределили переменную, и на этот раз ее интерпретировали как 1 декабря. Параметр set не влияет на функции datepart, такие как MONTH()
, потому что дата уже была интерпретирована и не хранится внутри, как вы ее набрали.
Вместо того, чтобы объявлять литературные даты с региональным и неоднозначным форматированием, вы всегда должны использовать безопасные, недвусмысленные форматы. Для даты и времени/smalldatetime:
yyyymmdd
yyyy-mm-ddThh:mm:ss
На сегодняшний день:
yyyy-mm-dd
Если вы хотите отобразить даты в этих дружественных, но запутанных форматов, всеми средствами сделать это на уровне представления. Но не пытайтесь путать с ними SQL Server. Пожалуйста, прочтите this blog post и this article by Tibor Karaszi.
Query Analyzer? Неужели я искал время назад 10 лет? –
Если вы используете ** основанную на языке/не зависящую от вас ** строчную дату (например, ** ISO-8601 ** стандартный формат 'YYYYMMDD') - например, 'set @aaa = '20111201'' - тогда вы можете переключаться между форматами даты столько раз, сколько хотите - вы будете ** ВСЕГДА ** получите' 12' за месяц ...... –