Как из поля с типом DATE извлечь номер месяца/года

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Как из поля с типом DATE извлечь номер месяца/года

Сообщение LeviaFan » 11 апр 2008, 21:48

У меня есть запрос

CREATE VIEW TICK_CO(
COMPANE_NAME,
MONTH_,
TICKET_COUNT)
AS
SELECT
train_company.company_name, ticket.date_, count(ticket.ticket_id)
from train_company join (train join (route join ticket on route.route_id=ticket.route_id) on train.company_id=route.train_id) on train_company.company_id=train.company_id
group by train_company.company_name, ticket.date_;

результат выполнения кол-во билетов проданных за каждый день, но хочу стедать так, чтобы выводилась не дата(ММ.ДД.ГГГГ) а номер месяца(или его название).
Большое спасибо!

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 11 апр 2008, 22:19

Читай букварь. Номер месяца - встроенная функция extract с соответствующими параметрами. Наименование можно case'ом (для FB1.5 и выше) или UDF'кой получить.

LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Сообщение LeviaFan » 11 апр 2008, 22:21

Я понять не могу как пользоваться EXTRACT'ом скачал LANGREF там ниче не нашел =(

LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Сообщение LeviaFan » 11 апр 2008, 22:21

а то что CASE есть я знаю

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 11 апр 2008, 22:35

LeviaFan писал(а):Я понять не могу как пользоваться EXTRACT'ом скачал LANGREF там ниче не нашел =(
А что, поиск в Acrobat Reader уже не пашет?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 11 апр 2008, 22:44

Если имеется в виду LangRef от IB6, то там, если мне не изменят склероз, про Extract написано очинно содержательно. В смысле он упомянут в списке ключевых слов и фсё :-D

Extract (Month From MyField)

LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Сообщение LeviaFan » 11 апр 2008, 22:46

Merlin писал(а):Если имеется в виду LangRef от IB6, то там, если мне не изменят склероз, про Extract написано очинно содержательно. В смысле он упомянут в списке ключевых слов и фсё :-D

Extract (Month From MyField)
Ага именно так)) но я уже разобрался) пример нашел, но всё же спасибо!

И ещё один вопрос, но малясь не по этой теме...

select route.route_id, cast(end.times-begin.times as time)
без конфертации выдаёт значения в несколько тысяч, когда пытаюсь перегнать в TIME пишет что ПЕРЕПОЛНЕНИЕ

ЗЫ Я тут хочу посчитат ьвремя в пути...

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 11 апр 2008, 23:07

Не знаю что у вас за LengRef.pdf, но у меня он тоже от InterBase 6 с размером 2769574. И там функция extract есть и в содержании и в индексе, и ей посвящена целая страница с подробным описанием параметров и примерами.
LeviaFan писал(а):ЗЫ Я тут хочу посчитат ьвремя в пути...
Разница между двумя timestamp'ами в FB по-моему получается в долях дня. Соотвественно, не надо никаких cast'ов, надо просто умножить на 24, чтобы получить её в часах, на 24*60 -- в минутах и т.д. Опять же, это всё основы. Неужели этого нет даже в FAQ'е?
Последний раз редактировалось Slavik 11 апр 2008, 23:17, всего редактировалось 1 раз.

LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Сообщение LeviaFan » 11 апр 2008, 23:11

Slavik писал(а):Не знаю что у вас за LengRef.pdf, но у меня тоже он от InterBase 6 с размером 2769574. И там функция extract есть и в содержании и в индексе, и ей посвящена целая страница с подробным описанием параметров и примерами.
в том что у меня, extract встречается только в списке ключевых слов! и ц раза как ОБЫЧНОЕ слово в предложении

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 11 апр 2008, 23:20

Попробуй поискать ib65_docs_for_delphi.zip в инете.

LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Сообщение LeviaFan » 11 апр 2008, 23:35

Я пошарился по FAQ'у кое что нашел, похожие вопросы были, но как мне кажетсмя не то.изначально все поля times у меня были типа TIME при вычитании (9:30:00-8:00:00 по идее долно быть 1:30:00), а выдаёт мне 5 400,000. При смене на timestamp выдаёт дробное значение.....

вот очень похожий пример но не могу вкурить
http://www.sql.ru/forum/actualthread.aspx?tid=163798

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 11 апр 2008, 23:51

Ну, давай попробуем подумать головой :) Поделим 5400 на 1.5 часа - что получим? Никаких ассоциаций не вызывает? :) Time - это чиста время. В секундах и в пределах 24 часов. TimeStamp - датавремя. В днях, и типа дробное. На самом деле нет, хранится в двух интах, дата отдельно, время отдельно. Но выдаётся и участвует в вычислениях через скрытые принудительные преобразования. Вычитая получаем интервал, который ни в тот ни в другой формат не лезет. Для Time, в пределах суток - в секундах, для таймштампа - в дробных днях. Ни то, ни другое не может ложиться в базовые типы, это просто числа. Не в смысле календаря, а в смысле числительных :)

LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Сообщение LeviaFan » 12 апр 2008, 00:01

перевёл все типы обратно в TIME, ибо доли дня не нужны.
(time_end_r.times-time_begin_r.times)/3600
счас он выдаёт 1,5
желаемый результат в формате чч:мм:сс
](*,)

PS мне и нужо в пределах суток значения только в интервале от 00:00 до 23:59

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 12 апр 2008, 00:34

Хватит биться головой об стену. Ею надо думать. Если разница time1-time2 = Секунды, то time2+Секунды=time1. Т.е. можно полученную разницу добавить к 00:00:00, чтобы обрести счастье.

P.S. Что ты будешь делать, если время в пути пересечёт полночь?

LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Сообщение LeviaFan » 12 апр 2008, 00:39

Slavik писал(а): P.S. Что ты будешь делать, если время в пути пересечёт полночь?
ну такого не может быть по условию!

во как О_О
(time_end_r.times-time_begin_r.times)+cast('00:00:00' as time)

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 12 апр 2008, 00:44

Ню-Ню. Задачки значит решаем. А в жизни всякие условия могут быть.

LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Сообщение LeviaFan » 12 апр 2008, 00:52

Slavik писал(а):Ню-Ню. Задачки значит решаем. А в жизни всякие условия могут быть.
тогда уж если такой случай попадётся, то получится отрицательное число, верно? если так, то добавлять не 0 часов а 12!

типа 00,40-11,40 = -11
тогда 00,40-11,40+12=1

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 12 апр 2008, 09:36

LeviaFan писал(а):...верно?
Проверь. Чего гадать-то?

LeviaFan
Сообщения: 11
Зарегистрирован: 05 апр 2008, 06:17

Сообщение LeviaFan » 14 апр 2008, 03:52

Slavik писал(а):
LeviaFan писал(а):...верно?
Проверь. Чего гадать-то?
ну по логике правильно, считает верно... но вот загвостка, разве можно в запросе использовать IF??? или условие делаетсе пере SELECT'ом

Ответить