Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Формат даты в Oracle  (Прочитано 42880 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 03-04-2006 13:15 » 

До книг я еще не добрался, а интересные факты уже вылазят.

2453829 == 2006 апрель 03

Хм... Они часом не от сотворения мира отсчитывают?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #1 : 03-04-2006 14:03 » 

угу, от 00.00.0000
Код:
SQL> SELECT to_date('03.04.2006', 'dd.mm.yyyy')-2453828 FROM dual;

TO_DATE('03.04.2006','DD.MM.YY
------------------------------
00.00.0000
« Последнее редактирование: 04-12-2007 21:36 от Алексей1153++ » Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 03-04-2006 15:07 » 

Код:
SELECT TO_DATE(2453829, 'J'), TO_DATE(2453828, 'J');

03.04.06   02.04.06
^^^^Это не реальный дамп, а по памяти - сегодня пробовал.
Т.е. тут расчет в днях. 'J' - юлианский календарь. Т.е. все таки от сотворения мира...

Просто много для меня нового. Я привык к mysql. Язык тот же, но набор ф-ий другой. И некоторые операторы иначе работают. И, почему-то, кавычки одного типа только принимает. В общем, загадочная система и тормозная (первое впечатление - реально не сравнивал): DISTINCT для 5млн записей минут 40 выполнялся.
« Последнее редактирование: 04-12-2007 21:37 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #3 : 04-04-2006 05:11 » 

Oracle гораздо быстрей MySql если его правильно настроить.
И язык не совсем тот же.
Вот, например, у меня Distinct на 3 милионах выполнялся 25 секунд. Правда и сервак довольно мощный.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 04-04-2006 06:27 » 

RXL, не сравнивай. Типа "торг здесь не уместен" Улыбаюсь
Задачи разные бывают, условия и тд. Возможно таблица не проиндексирована отсюда и тормоза.
А к pl/sql просто надо привыкнуть. Очень простой и очень понятный язык - встроенные функции имеют "человеческие имена" (sys_date, for example). Преобразование форматов типа to_date, to_number, to_char
Cтолкнешься с виртульной таблицей dual - не пугайся, прими на веру.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #5 : 04-04-2006 10:06 » 

Sla, во всяком диалекте есть свои плюсы и минусе, например встроенные процедуры и функции - это хорошо, но нет TOP 1, из-за чего приходиться извращаться при выборке необходимых данных, хотя в MSSQL это делается просто...
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #6 : 04-04-2006 10:13 » 

например... Не понял
Записан

Удачного всем кодинга! -=x[PooH]x=-
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #7 : 04-04-2006 10:35 » 

например надо выбрать последнюю запись из тех, у которых дата сохранения меньше или равна заданной.

в MSSQL:
Select TOP 1 * From tbl Where date<=my_date Order By date desc
(не уверен в синтаксисе - пишу на вскидку, но примерно так)

в PL\SQL:
Select * From
 (Select * From tbl Where date<=to_date(my_date,'dd.mm.yyyy') Order By date desc)
Where ROWNUM=1

т.е. в PL\SQL получаем запрос из запроса в более сложных вариантах проблемм больше...
« Последнее редактирование: 04-12-2007 21:50 от Алексей1153++ » Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #8 : 04-04-2006 11:23 » 

Sla, во всяком диалекте есть свои плюсы и минусе, например встроенные процедуры и функции - это хорошо, но нет TOP 1, из-за чего приходиться извращаться при выборке необходимых данных, хотя в MSSQL это делается просто...

Есть такое Улыбаюсь Но всему есть и альтернатива Ага MSSQL - TOP , MySQL - LIMIT и на Oracle можно сделать Улыбаюсь
Вот например :
MSSQL
Код:
create procedure sql_sp_select_top
as
DECLARE @a number
select top 1 @a=col1 from tab1

То же на Oracle
Код:
CREATE OR REPLACE PROCEDURE sql_sp_select_top
AS
v_a VARCHAR2(255);
BEGIN
select col1 INTO v_a from tab1 WHERE ROWNUM <=1;
END;

ЗЫ. Имхо TOP  в MSSQL и LIMIT в MySQL однозначно рулит Улыбаюсь Жаль что в Оракле не продумали подобного механизма Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #9 : 04-04-2006 11:29 » 

ну это SQL а не PL\SQL
в PL\SQL
for v in (Select * From tbl Where date<=to_date(my_date,'dd.mm.yyyy') Order By date desc) loop
res := v.my_date;
exit;
end loop;

да и вьюху проще сделать...

а, например, предпоследнюю ? Ага

я согласен с
Цитата
Типа "торг здесь не уместен"

нужно выбирать  СУБД для конкретной задачи.
« Последнее редактирование: 19-12-2007 22:16 от Алексей1153++ » Записан

Удачного всем кодинга! -=x[PooH]x=-
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #10 : 04-04-2006 11:32 » 

Цитата
Жаль что в Оракле не продумали подобного механизма
ну это все делается как раз через
Select * From
 (Select * From tbl Where ... order ... desc)
Where ROWNUM<Х

http://www.ispirer.com/doc/sqlways38/Output/SQLWays-1-044.html
« Последнее редактирование: 04-04-2006 11:34 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 04-04-2006 11:43 » 

Спасибо всем. Интересно рассказываете. Я как раз сразу обнаружил нехватку LIMIT.
Почитаю, подкуюсь - будут вопросы Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #12 : 04-04-2006 12:27 » 

PooH, курсоры в PL\SQL это вообще отдельная тема, некоторые только их и используют, хоть они и быстро работают, но иногда лучше без них...
В твоем варианте сначала выбираются все данные, а потом из них ты выбираешь значение в переменную (а если нужно выбрать несколько значений из строки)...
В запросе SQL сразу возвращаются нужные данные...

в PL\SQL много можно сделать, но некоторые вещи просто делаются извратно...
Упомянутый формат Data - это вообще отдельная песня...

Опять же есть огромные плюсы, например те же подпроцедуры...

Согласен с
нужно выбирать  СУБД для конкретной задачи.

Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #13 : 04-04-2006 12:47 » 

Цитата
Жаль что в Оракле не продумали подобного механизма
ну это все делается как раз через
Select * From
 (Select * From tbl Where ... order ... desc)
Where ROWNUM<Х
Енто понятно, только как-то громоздко Ага
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #14 : 04-04-2006 13:49 » 

Цитата
В твоем варианте сначала выбираются все данные, а потом из них ты выбираешь значение в переменную (а если нужно выбрать несколько значений из строки)
Выбирается одна запись. Все данные записи есть в курсорной переменно v. res использовал для примера. А если нужно несколько значений - можно и курсор объявить отдельно, и курсорную переменную и таблицу курсорнух переменных. Я привел пример, именно PL\SQL - кода просто, чтобы отличить SQL от PL\SQL, можно было и так написать (уже с SQL не перепутаешь):
BEGIN
select col1 INTO v_a from tab1 WHERE ROWNUM <=1;
END;

просто, по-моему, тут небольшая путаница, между Oracle Sql и PL\SQL возникла.
Записан

Удачного всем кодинга! -=x[PooH]x=-
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #15 : 04-04-2006 13:53 » 

Цитата
Упомянутый формат Data - это вообще отдельная песня
Как раз по теме! Улыбаюсь
Давай обсудим.
Иногда совсем не обязательно использовать to_date... достаточно установить переменную сессии NLS_DATE_FORMAT.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #16 : 05-04-2006 06:29 » 

Pooh, ты совсем упростил - нет ни выборки по дате, ни сортировки...

BEGIN
select col1 INTO v_a from tab1 WHERE ROWNUM <=1;
END;

Тут все правильно, но если чуть усложнить, то появляются проблемы...

Про Date могу сказать, что в SQL есть два типа Date и DateTime. Так вот при связи Оракла с другими прогами возникали проблемы..
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #17 : 05-04-2006 08:00 » 

Цитата
ты совсем упростил - нет ни выборки по дате, ни сортировки...
опять же это просто пример кода...

Цитата
то появляются проблемы...
есть такие, которые не получилось решить?

Цитата
Так вот при связи Оракла с другими прогами возникали проблемы..
А, ты вот про что. Я подумал, что проблемы внутри Oracle.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #18 : 05-04-2006 10:08 » 

Цитата
ты совсем упростил - нет ни выборки по дате, ни сортировки...
опять же это просто пример кода...

Я же сказал:
например надо выбрать последнюю запись из тех, у которых дата сохранения меньше или равна заданной.

в PL\SQL:
Select * From
 (Select * From tbl Where date<=to_date(my_date,'dd.mm.yyyy') Order By date desc)
Where ROWNUM=1

это конкретный пример с которым недавно сталкнулся.

Цитата
то появляются проблемы...
есть такие, которые не получилось решить?

Решаются, но извратно...

Вообще-то спол не имеет смысла, ведь уже говорилось:
Согласен с
нужно выбирать  СУБД для конкретной задачи.
« Последнее редактирование: 04-12-2007 21:51 от Алексей1153++ » Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #19 : 05-04-2006 11:19 » 

Цитата
Вообще-то спол не имеет смысла.
Мы, вроде бы, ниочем и не спорим.
По-моему, возникло какое-то недопонимание... А никого не переубеждаю и не навязываю своего мнения и не защищаю Oracle.
Просто мне приходтся с ним работать уже больше 4 лет...

Мои посты типа "for v in..." и "Begin select * ...." только для разделения мух и котлет - разделения ORACLE SQL(язык запросов) и PL\SQL (процедурный язык). Все вопросы про проблемы - для самообразования, по-этому после фраз:
Цитата
Решаются, но извратно...
так и хочется спросить - какие именно проблемы и как решаются?

Цитата
это конкретный пример с которым недавно сталкнулся.
могу тоже привести пример: нужно выгрузить 300000 в ексель, на одной странице у него 65535 - задача написать запрос (SQL, не PL\SQL): пронумеровать строки (доп.требование) и выбрать последовательно - я делал тройным запросом (модифицирую для каждой части). Интересно узнать - как это можно было реализовать в MSSQL или MySQL?
Записан

Удачного всем кодинга! -=x[PooH]x=-
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #20 : 05-04-2006 13:29 » 

Фишка в том, что SQL работает через какую-нибудь прогу, и такие вопросы разруливаются прогой....
Кстати, если ексель на машине пользователя, то там тоже другая прога...
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #21 : 05-04-2006 13:37 » 

Ну скажем по другому: есть таблица из 1000000 строк, нужно, выбрать из них 300000 (по условию), пронумеровать от 1 до 300000, и выбрать строки с 60000 по 199999. (вот именно так у меня и получился тройной запрос).
select * from (select rownum, t.* (select * from table where ...) t) s where s.rownum between 60000 and 119999;

Вопрос можно ли в MySQL или MSSQL сделать проще?
Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 05-04-2006 14:21 » 

MySQL 4.0:
SEТ @cnt=0;
SELECT @cnt=@cnt+1 AS 'N', * FROM tbl WHERE ... LIMIT 0,60000;
SELECT @cnt=@cnt+1 AS 'N', * FROM tbl WHERE ... LIMIT 60000,60000;
SELECT @cnt=@cnt+1 AS 'N', * FROM tbl WHERE ... LIMIT 120000,60000;
....
Все запросы в одной сессии. Таблицу стоит заблокировать (для MyISAM).
Насчет работы с переменными стоит уточнить - немного подзабыл.

Или я все же не понял... rownum - существующий столбец в таблице или как?
« Последнее редактирование: 04-12-2007 21:52 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #23 : 05-04-2006 15:19 » 

rownum (как, например, и rowid) это мнимые что ли... rownum есть у записи всегда - это номер записи в результе запроса
Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #24 : 05-04-2006 16:03 » 

Понятно Улыбаюсь

Поправка к mysql коду: переменные в SELECT присваиваются через ':='.
« Последнее редактирование: 04-12-2007 21:53 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 06-04-2006 06:10 » 

rownum & rowid - такие виртуальные (псевдостолбцы), существуют на время запроса
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #26 : 06-04-2006 09:35 » 

немного уточню, rowid существует постоянно и относится к конкреной записи.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines