Наступление на Сандепу началось в ночь на 25 января 1905 года. Его предваряла артиллерийская подготовка в основном из легких, скорострельных орудий, поэтому вражеские огневые точки оказались не поврежденными. Две трети артиллерии 2-й армии (вновь!) оказались в резерве. 1-й Сибирский корпус генерала Г.К. Штакельберга неожиданной быстрой атакой захватил всю линию реки Ханьхэ. Оборонявшиеся здесь японцы, бросая оружие, бежали.
К 22 часам следующего дня корпус выполнил поставленную задачу и овладел укрепленными селениями Сумапу и Хэгоутай, выбив оттуда японцев. Однако после ночного успеха наступление развивалось крайне медленно и застать японское командование врасплох не удалось. Зато маршал Ивао Ояма немедленно стал усиливать свой левый фланг и подтягивать войска к переднему краю, чтобы парировать натиск русских. Значительно был усилен и без того немалый гарнизон Сандепу, занимавший исключительно выгодное тактическое положение.
С утра 26 января русская артиллерия начала бомбардировать Сандепу и прилегающие к нему японские позиции, однако без видимого успеха. Совершенно ровная местность перед Сандепу в тот день была покрыта тонкой коркой льда. Сильный туман за-труднял движение наступавших войск. Из-за тумана часть полков, имевших к тому же потери в людях и командирах, перемешалась и вместо восточного направления взяла юго-восточное. В 600-800 шагах от ближайших глинобитных домов Сандепу атакующие залегли и в течение шести часов, до самого сигнала к атаке, находились под убийственным ружейным огнем японцев.
Командир 14-й дивизии, непосредственно наступавшей на Сандепу, С.И. Русанов, тщетно искал командира корпуса, чтобы доложить обстановку. Не получив подкреплений и артиллерийской поддержки, дивизионный начальник не осмелился начать общую атаку. Однако ночью два полка его дивизии ворвались в какую-то китайскую деревню, из которой бежала японская пехота.
Ночной успех дал повод Русанову доложить корпусному командиру: "Дивизия поставленную задачу выполнила. Сандепу, вся разрушенная артогнем, в наших руках". Через час об этом ночном успехе стало известно главнокомандующему, и Куропаткин отдал приказ командующему 2-й армией "воздержаться от дальнейшей атаки, ограничиваясь удержанием Сандепу". Это селение он считал "ключом" ко всей неприятельской оборонительной позиции.
С рассветом, когда туман рассеялся, выяснилось, что 14-я дивизия с боем захватила не Сандепу, а находившуюся 400 метров севернее от нее деревню Баотайцзы, которая в течение двух дней подвергалась артиллерийскому обстрелу. А самое большое селение Сандепу, хорошо укрепленное, огонь русской полевой артиллерии так и не затронул. Дальнейшие попытки захватить его успеха не имели. 14-я дивизия, потеряв 1122 человека убитыми и замерзшими ночью в поле, отошла на исходные позиции, откуда она начинала наступление.
На фронте 1-го Сибирского корпуса продолжались ожесточенные бои. Японцы, как выяснилось через пленных, усилили это направление резервами и перешли к контратакующим действиям. Русские сравнительно легко отбивались с помощью огня полевых батарей. Когда на правом фланге корпуса начал атаковывать врага переправившийся через реку Хуньхэ кавалерийский отряд генерала П.И. Мищенко (около 40 эскадронов и сотен), 1-й Сибирский корпус начал наступать.
Однако совсем скоро его "самодеятельность" закончилась: приказом сверху ему было велено прекратить неплановое наступление и перейти к обороне. Благодаря этому японское командование "выиграло" целые сутки, чтобы принять адекватные меры против начавшегося наступления противника.
Кавалерийский генерал П.И. Мищенко, тонко уловив возможность большого успеха, обратился к командиру 1-го Сибирского корпуса генералу Штакельбергу с просьбой начать наступление в восточном направлении, пока японцы еще не подтянули туда резервы. Тот решился еще раз проявить личную инициативу в начавшемся сражении за Сандепу, и полки корпуса, перешедшие в атаку, сразу же достигли успеха. При этом в ходе ночной атаки четырех полков 1-й Сибирской дивизии была наголову разгромлена 3-я японская пехотная дивизия, которая защищала укрепленную деревню Сумапу.
Теперь русские войска получали хорошую возможность окружить Сандепу и неприятельские войска, сосредоточенные в этом селении. Конница генерала П.И. Мищенко стала выходить в ближние японские тылы и заставила противника оставить позицию у деревни Цзяньцзявопу. Сама обстановка требовала от русского командования наращивания атакующих усилий.
Но как только об этом стало известно командующему 2-й армией генералу от инфантерии О.К. Гриппенбергу, корпусной командир получил от него приказ немедленно остановиться и не "ломать" общую позиционную линию. Японцы же, не теряя времени и подтянув значительные резервы, отбили у русских деревню Сумапу с ее укреплениями. Русским войскам пришлось отступить с большими потерями. Это поражение стало прямым предлогом для отстранения от командования корпусом генерала Г.К. Штакельберга.
Впоследствии Военно-историческая комиссия по изучению русско-японской войны 1904-1905 годов отметит: "Едва лишь войска 10-го корпуса успели сделать первые шаги своего наступления, как уже было получено новое приказание генерал-адъютанта Гриппенберга, которое предостерегало от энергичных наступательных действий".
С наступлением светового дня 15 января, после сильной артиллерийской подготовки, полки русской 31-й пехотной дивизии стремительной атакой захватили несколько китайских деревень близ Сандепу и, выйдя с боем во вражеский тыл, поставили японцев в критическое положение. Они напрягали все силы, чтобы сдержать наступавших. Императорский главнокомандующий маршал Ивао Ояма доносил о том дне русского наступления в Токио:
"15 января русские обстреляли наш тыл. Сражение продолжалось в течение всего дня и ночи, наши всюду были придавлены численностью русских. В этот день наши войска были готовы к тому, что будут уничтожены".
Чтобы спасти положение и не допустить полного прорыва своего фронта у Сандепу, маршал Ивао Ояма поздно вечером, собрав в кулак все наличные силы пехоты и полевой артиллерии, четырежды атаковывал 1-й Сибирский корпус, но безуспешно. Последнее слово в битве за Сандепу осталось за генералом от инфантерии А.Н. Куропаткиным, который в конце дня 15 января он приказал прекратить наступление: "Войскам в эту ночь отступить и занять сосредоточенное положение", а самой удачливой 31-й дивизии было приказано отойти под прикрытием ночной темени на исходные позиции, вернув тем самым японцам отбитые у них деревни.
Отступление за реку Хуньхэ в морозной ночи было спешное, неорганизованное. В одной из захваченных деревень в суматохе осталось два батальона русской пехоты, до которых приказ не дошел. Под утро они приняли на себя удар целой 8-й японской дивизии и, сдерживая ее натиск, сражались до последнего солдата среди развалин китайских глинобитных фанз. Отошел и кавалерийский отряд генерал-адъютанта П.И. Мищенко, действовавший, по существу, в тылу японских войск.
Так высшее русское командование отказалось закрепить и развить несомненный успех своих наступавших войск. Советский военный историк комбриг Н.А. Ливицкий, рассматривая январское сражение, сделал следующий вывод: "Основная причина неудачи у Сандепу - отсутствие руководства боем". Пожалуй, красноречивее этого не скажешь.
1-я и 3-я русские Маньчжурские армии, изготовившиеся для общего наступления, так и остались стоять на исходных позициях в полном бездействии. Их войска оказались как бы сторонними наблюдателями происходивших событий в полосе фронта 2-й Маньчжурской армии. На следующий день, 16 января, главнокомандующий А.Н. Куропаткин сообщил в Санкт-Петербург:
"Вчера в 17 часов произведено наступление на деревни Сяотайцзы и Лабатай (10 корпус). Войска вели себя отлично. С наступлением темноты... части, выполнив возложенную задачу, были отведены назад, не преследуемые противником".
Так закончилось январское наступление 2-й русской армии. Японцы зимой наступать не собирались. В 4-дневном сражении при Сандепу русские потеряли 368 офицеров и 11 364 солдата, среди них было очень много обмороженных. Японские потери составили 8901 человек.