powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странные наводки
9 сообщений из 9, страница 1 из 1
Странные наводки
    #39948475
artemiuss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
alter session set nls_territory='BANGLADESH';
select trunc(timestamp '2020-04-18 19:57:22.0', 'D') from dual;

alter session set nls_territory='ALGERIA';
select trunc(timestamp '2020-04-18 19:57:22.0', 'D') from dual;



2020-04-17 00:00:00.0
2020-04-17 00:00:00.0

Код: plsql
1.
2.
3.
4.
5.
alter session set nls_territory='BANGLADESH';
select trunc(timestamp '2020-04-18 19:57:22.0', 'D'),  to_timestamp('2020-04-18 19:57:22.0', 'YYYY-MM-DD HH24:MI:SS.FF') from dual;

alter session set nls_territory='ALGERIA';
select trunc(timestamp '2020-04-18 19:57:22.0', 'D'),  to_timestamp('2020-04-18 19:57:22.0', 'YYYY-MM-DD HH24:MI:SS.FF') from dual;


2020-04-17 00:00:00.0 2020-04-18 19:57:22.0
2020-04-18 00:00:00.0 2020-04-18 19:57:22.0

Почему так?
...
Рейтинг: 0 / 0
Странные наводки
    #39948489
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artemiuss,



Я бы скорее поинтересовался - почему 2020-04-17

А серьезно - какаято гуёвая ошибка - выскакивает в plsql developer, лечится путем добавления лишнего пробела перед from или переносом from на следующую строку.

plsql developer:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
alter session set nls_territory='BANGLADESH';
Session altered
select trunc(timestamp '2020-04-18 19:57:22.0', 'D') from dual;
TRUNC(TIMESTAMP'2020-04-1819:5
------------------------------
17-Apr-20

alter session set nls_territory='ALGERIA';
Session altered
select trunc(timestamp '2020-04-18 19:57:22.0', 'D') from dual;
TRUNC(TIMESTAMP'2020-04-1819:5
------------------------------
17-Apr-20

alter session set nls_territory='BANGLADESH';
Session altered
select trunc(timestamp '2020-04-18 19:57:22.0', 'D')
from dual;
TRUNC(TIMESTAMP'2020-04-1819:5
------------------------------
18-Apr-20

alter session set nls_territory='ALGERIA';
Session altered
select trunc(timestamp '2020-04-18 19:57:22.0', 'D')
from dual;
TRUNC(TIMESTAMP'2020-04-1819:5
------------------------------
18-Apr-20


В sqlplus все выполняется корректно - 2020-04-18.

А вы с этими играми понимаете, что nls_territory меняет еще кучу nls параметров (форматов например) , а у вас разные типы данных на выходе - так что много всяких нежданок может быть .

Regards

Maxim
...
Рейтинг: 0 / 0
Странные наводки
    #39948505
artemiuss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Demenko,

для BANGLADESH first day of week - это Friday => 17
для ALGERIA - это Saturday => 18
...
Рейтинг: 0 / 0
Странные наводки
    #39948528
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artemiuss,

Да , перепутал форматную маску.
Ну тогда похоже скорее всего на какой то придурковатый кэш

Особенно последние два селекта прикольно выглядят
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
SQL> SQL> alter system flush shared_pool;

System altered.

SQL>
SQL> alter session set NLS_TERRITORY='BANGLADESH';

Session altered.

SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts  from dual;

TS
----------
17-04-2020

SQL> alter session set NLS_TERRITORY='AMERICA';

Session altered.

SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts  from dual;

TS
------------------
17-APR-20

SQL> alter session set NLS_TERRITORY='ALGERIA';

Session altered.

SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts  from dual;

TS
--------
17-04-20

SQL>
SQL>
SQL>
SQL>
SQL> alter session set NLS_TERRITORY='BANGLADESH';

Session altered.

SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts,1  from dual;

TS                  1
---------- ----------
17-04-2020          1

SQL> alter session set NLS_TERRITORY='AMERICA';

Session altered.

SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts,2  from dual;

TS                          2
------------------ ----------
12-APR-20                   2

SQL> alter session set NLS_TERRITORY='ALGERIA';

Session altered.

SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts,3  from dual;

TS                3
-------- ----------
18-04-20          3

SQL>
SQL> alter system flush shared_pool;

System altered.

SQL>
SQL> alter session set NLS_TERRITORY='AMERICA';

Session altered.

SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts  from dual;

TS
------------------
12-APR-20

SQL> alter session set NLS_TERRITORY='BANGLADESH';

Session altered.

SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts  from dual;

TS
----------
12-04-2020

SQL> alter session set NLS_TERRITORY='ALGERIA';

Session altered.

SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts  from dual;

TS
--------
12-04-20

SQL>
SQL>
SQL> select trunc(timestamp '2020-04-18 18:57:22.0', 'D') ts  from dual;

TS
--------
18-04-20

SQL>
SQL> select trunc(timestamp '2020-04-18 19:57:22.0', 'D') ts  from dual;

TS
--------
12-04-20



Regards

Maxim
...
Рейтинг: 0 / 0
Странные наводки
    #39948531
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
artemiuss,

Какой-то очевидный баг: NLS настройки в запросе с только литералами используются те, которые были у первого выполнения(курсора), что легко проверяется изменением порядка выполнения Алжир->Бангладеш или Бангладеш->Алжир. Если же вместо литералов будут столбец из какой-нибудь таблицы, то бага не будет. И, видимо, для обхода этого бага, оракл при наличии to_timestamp() в запросе оракл сравнивает NLS настройки и принудительно создает новый дочерний курсор, поэтому при to_timestamp бага нет.
В принципе баги такого рода частенько возникают, например, с группировкой по trunc


tests/timest.sql
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
SQL> !cat tests/timest.sql
alter system flush shared_pool;
col stext for a50;

alter session set nls_territory='BANGLADESH';
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select/*+timeA*/ trunc(timestamp '2020-04-18 19:57:22.0', 'D') A from dual;
select/*+timeB*/ trunc(ts, 'D') B from dates;
select/*+timeC*/ trunc(timestamp '2020-04-18 19:57:22.0', 'D') C,  to_timestamp('2020-04-18 19:57:22.0', 'YYYY-MM-DD HH24:MI:SS.FF') CC from dual;
select/*+timeD*/ trunc(date'2020-04-18', 'D') D from dual;

alter session set nls_territory='ALGERIA';
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select/*+timeA*/ trunc(timestamp '2020-04-18 19:57:22.0', 'D') A from dual;
select/*+timeB*/ trunc(ts, 'D') B from dates;
select/*+timeC*/ trunc(timestamp '2020-04-18 19:57:22.0', 'D') C,  to_timestamp('2020-04-18 19:57:22.0', 'YYYY-MM-DD HH24:MI:SS.FF') CC from dual;
select/*+timeC*/ trunc(timestamp '2020-04-18 19:57:22.0', 'D') C,  to_timestamp('2020-04-18 19:57:22.0', 'YYYY-MM-DD HH24:MI:SS.FF') CC from dual;
select/*+timeD*/ trunc(date'2020-04-18', 'D') D from dual;

select s.sql_id,s.child_number,
  s.executions,
  substr(sql_text,1,50) stext
from v$sql s
where sql_text like 'select/*+time%'
order by stext,child_number;

select s.sql_id,
  substr(sql_text,1,50) stext,
  e1.id,
  e1.name,
  e1.isdefault,
  e1.value,
  e2.value
from v$sql s,
     V$SQL_OPTIMIZER_ENV e1,
     V$SQL_OPTIMIZER_ENV e2
where sql_text like 'select/*+time%'
  and s.child_number=0
  and s.sql_id=e1.sql_id
  and s.sql_id=e2.sql_id
  and e1.child_number=0
  and e2.child_number=1
  and e1.id=e2.id
  and e1.value!=e2.value
;


@tests/timest
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
SQL> @tests/timest

System altered.


Session altered.


Session altered.


A
-------------------
2020-04-17 00:00:00


B
-------------------
2020-04-17 00:00:00


C                   CC
------------------- ---------------------------------------------------------------------------
2020-04-17 00:00:00 18-04-2020 07:57:22.000000000


D
-------------------
2020-04-17 00:00:00


Session altered.


Session altered.


A
-------------------
2020-04-17 00:00:00


B
-------------------
2020-04-18 00:00:00


C                   CC
------------------- ---------------------------------------------------------------------------
2020-04-18 00:00:00 18-04-20 07:57:22.000000000 PM


C                   CC
------------------- ---------------------------------------------------------------------------
2020-04-18 00:00:00 18-04-20 07:57:22.000000000 PM


D
-------------------
2020-04-17 00:00:00


SQL_ID        CHILD_NUMBER EXECUTIONS STEXT
------------- ------------ ---------- --------------------------------------------------
8w5chw35jdh3n            0          2 select/*+timeA*/ trunc(timestamp '2020-04-18 19:57
6t4uxwxhyxp6s            0          2 select/*+timeB*/ trunc(ts, 'D') B from dates
2cf8f2zqpgg4m            0          1 select/*+timeC*/ trunc(timestamp '2020-04-18 19:57
2cf8f2zqpgg4m            1          2 select/*+timeC*/ trunc(timestamp '2020-04-18 19:57
2uyt0dzrbbc45            0          2 select/*+timeD*/ trunc(date'2020-04-18', 'D') D fr


no rows selected

...
Рейтинг: 0 / 0
Странные наводки
    #39948532
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
artemiuss,

Попробуйте создать SR, вдруг в ближайшие 5-6 лет пофиксят
...
Рейтинг: 0 / 0
Странные наводки
    #39948552
artemiuss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да уж.
Пальцем в небо и попали в баг.
Оракл такой оракл.
...
Рейтинг: 0 / 0
Странные наводки
    #39948606
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
artemiuss,

На самом деле, непонятно зачем вам понадобилось литералы транкейтить? Никому в голову такое не приходит, вот баг и не обнаруживался
...
Рейтинг: 0 / 0
Странные наводки
    #39948662
artemiuss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,

Это не мне. У нас с коллегой возникла дискуссия на предмет того влияют ли настройки NLS на поведение данной функции. У Оракла в доке указано что на поведение данной функции не влияет NLS_CALENDAR. Но это нисколько не означает, что не влияет такой параметр как NLS_TERRITORY. Этот пример был придуман для чистоты эксперимента. Придуман не мной, но он ввел меня в ступор на некоторое время.
По поводу того что транкейтить литералы в реальной жизни не имеет смысла -- полностью согласен!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странные наводки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]