Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, SHEMA, Вы писали:
SHE>>А если стоит задача, к примеру, сгруппировать данные по месяцам, как здесь обойтись без форматирования даты (поле timestamp)?
S>1. Поле timestamp в T-SQL никакого отношения к месяцам не имеет. http://msdn.microsoft.com/en-us/library/ms182776.aspx
S>2. Если речь про datetime, то надо пользоваться функцией DatePart.
Не сказу что ею (DatePart функцией) удобно пользоваться.
Допустим есть таблица c полем TimeStamp типа datetime.
Нужно сгруппировать данные по месяцам за все годы.
SQL Server:
select (...) from (...) group by DatePart(year, TimeStamp) + '-' + DatePart(month, TimeStamp)
А вот Oracle-овский вариант:
select (...) from (...) group by to_char(TimeStamp, 'YYYY-MM')
Иногда форматирование очень даже востребовано на сервере (особенно даты и время), и в случае с SQL Server-ом ето не самый удобный синтаксис (про эффективность тоже можно вспомнить), из-за отсутствия аналогов to_char/to_date приходится пользоваться такими вот
самопалами.
Здравствуйте, SHEMA, Вы писали:
SHE>SQL Server:
SHE> select (...) from (...) group by DatePart(year, TimeStamp) + '-' + DatePart(month, TimeStamp)
Не надо так делать.
Надо делать так:
select (...) from (...) group by DatePart(year, TimeStamp), DatePart(month, TimeStamp)
SHE>Иногда форматирование очень даже востребовано на сервере (особенно даты и время), и в случае с SQL Server-ом ето не самый удобный синтаксис (про эффективность тоже можно вспомнить),
Ну, давайте вспомним про эффективность.
Здравствуйте, Sinclair, Вы писали:
SHE>>SQL Server:
SHE>> select (...) from (...) group by DatePart(year, TimeStamp) + '-' + DatePart(month, TimeStamp)
S>Не надо так делать.
S>Надо делать так:
S>select (...) from (...) group by DatePart(year, TimeStamp), DatePart(month, TimeStamp)
S>Ну, давайте вспомним про эффективность.
Ну давайте: Sql Server-ный вариант предполагает либо 1) два вызова DatePart плюс склеивание строк, либо 2) два вызова DatePart плюс группировка по двум полям. Oracle обходится одним вызовом функции и группировкой по одному полю. Вывод очевиден.