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

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

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

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

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

2453829 == 2006 апрель 03

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

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

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
Глобальный модератор

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


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

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
Глобальный модератор

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
Глобальный модератор

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
Глобальный модератор

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
Глобальный модератор

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
Глобальный модератор

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
Глобальный модератор

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
Глобальный модератор

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
Глобальный модератор

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
Глобальный модератор

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
Глобальный модератор

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


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

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

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines