Mar 18, 2008 23:07
Казалось бы простейшая и типичная задача: есть табличка с логом, т.е. одно поле - это datetime. Хочется посмотреть по дням сколько было записей в журнале.
Очевидный путь - отрезаем время и агрегируем. Так нет. В MS SQL нет функции, которая отрезает время. Вот отдельно год, квартал или секунды получить можно, а всю дату без времени - нельзя. Ладно, обойдемся cast'ом, будем оперировать строчками.
Далее делаем агрегацию типа:
SELECT convert(varchar(10),opertime,20), count(*)
FROM table
GROUP BY 1
Не получается. MS SQL не может догадаться, что ему надо сагрегировать по первому столбцу. Хорошо, поможем недоразвитому:
SELECT convert(varchar(10),opertime,20), count(*)
FROM table
GROUP BY convert(varchar(10),opertime,20)
Опять ошибка. Ладно, поименуем столбец
SELECT convert(varchar(10),opertime,20), count(*)
FROM table
GROUP BY convert(varchar(10),opertime,20)
То же самое. Пришлось делать так:
CREATE VIEW stupid_microsoft as
SELECT convert(varchar(10),opertime,20) operdate
FROM table
SELECT operdate,count(*)
FROM stupid_microsoft
GROUP BY operdate.
В ORACLE еще 10 лет назад данная проблема решалась за 15 секунд без заглядывания в документацию.
programming