Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 не корректная работа с датой через openquery  [new]
MasterOfCode
Member

Откуда:
Сообщений: 63
Запрос :
select *  
into #DailyLoaded
from openquery(DBLinkNameOra, 'select *
				from TableName t
				where t.dateField between to_date(sysdate, ''dd.MM.yyyy'') and sysdate+1')

Возвращает абсолютно все значения из Оракла. Если убрать преобразования to_date, то тогда он возвращает все данные попавшие в условие, но еще с учетом времени суток.

Кто может объяснить такое странное поведение сервера?
4 авг 11, 08:11    [11068487]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
MasterOfCode
Member

Откуда:
Сообщений: 63
В оракле данный запрос отрабатывает корректно.
4 авг 11, 08:17    [11068495]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
openquery ничего не делает с запросом. Проверьте это трассировкоq на стороне Oracle.

автор
В оракле данный запрос отрабатывает корректно.


Да ну? М.б. так, все-таки

where 
  t.dateField >= to_date(sysdate, 'dd.MM.yyyy') 
  and t.dateField < to_date(sysdate, 'dd.MM.yyyy') + 1


Сообщение было отредактировано: 4 авг 11, 08:25
4 авг 11, 08:25    [11068508]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
MasterOfCode
Member

Откуда:
Сообщений: 63
pkarklin
openquery ничего не делает с запросом. Проверьте это трассировкоq на стороне Oracle.

автор
В оракле данный запрос отрабатывает корректно.


Да ну? М.б. так, все-таки

where 
  t.dateField >= to_date(sysdate, 'dd.MM.yyyy') 
  and t.dateField < to_date(sysdate, 'dd.MM.yyyy') + 1


Есть подозрения что делает. По крайней мере с датами какой-то перемудр.
В SQL Server настройка даты стоит такая: yyyy-MM-dd
в Оракле dd.MM.yyyy из-за этого и не работал запрос.

Такой запрос работать не будет:

select *  
into #DailyLoaded
from openquery(DBLinkNameOra, 'select *
				from TableName t
				where t.dateField >= to_char(sysdate, ''dd.MM.yyyy'') 
					and t.dateField >= to_char(sysdate+1, ''dd.MM.yyyy'')')

а такой будет:

select *  
into #DailyLoaded
from openquery(DBLinkNameOra, 'select *
				from TableName t
				where t.dateField >= to_char(sysdate, ''yyyy-MM-dd'') 
					and t.dateField >= to_char(sysdate+1, ''yyyy-MM-dd'')')
4 авг 11, 09:14    [11068610]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
trunc(sysdate,'DD')
4 авг 11, 09:23    [11068638]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
MasterOfCode
Member

Откуда:
Сообщений: 63
Geep,

Спасибо! То что нужно. Все же openquery преобразует каким-то образом запрос.
4 авг 11, 09:28    [11068659]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
Glory
Member

Откуда:
Сообщений: 104751
MasterOfCode
Все же openquery преобразует каким-то образом запрос.

Т.е. вы сами увидели, что на Оракл пришел другой запрос ?
4 авг 11, 09:57    [11068775]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
MasterOfCode,
OpenQuery не преобразует, просто некоторые функции ORACLE NLS-зависимые...
4 авг 11, 10:42    [11069034]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7498
Миль пардон, сударь. Но на куа нужно делать
to_date(sysdate,'маска юзверя')
?
Фактически вы сказали СУБД следующее :
Возьми системную дату типа ДАТА, преобразуй её по маске NLS-настроек в СТРОКУ, затем эту СТРОКУ преобразуй в ДАТУ по юзверьской маске.
4 авг 11, 10:54    [11069117]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7498
OpenQuery отработал честно. Честно передал дебильное двойное преобразование СУБД, СУБД не менее честно выполнила это преобразование (смысла нет, но раз уж юзер хочет....).

Так что ваш запрос выполнен именно так, как вы его сами же и написали.
4 авг 11, 10:57    [11069136]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
MasterOfCode
Такой запрос работать не будет:


Так как Вы написали, точно не будет.
4 авг 11, 10:58    [11069155]     Ответить | Цитировать Сообщить модератору
 Re: не корректная работа с датой через openquery  [new]
MasterOfCode
Member

Откуда:
Сообщений: 63
env
Миль пардон, сударь. Но на куа нужно делать
to_date(sysdate,'маска юзверя')
?
Фактически вы сказали СУБД следующее :
Возьми системную дату типа ДАТА, преобразуй её по маске NLS-настроек в СТРОКУ, затем эту СТРОКУ преобразуй в ДАТУ по юзверьской маске.

Согласен, тут переборщил.
Glory
Т.е. вы сами увидели, что на Оракл пришел другой запрос ?

Проверил трассировкой, действительно, передает то, что пишу в openquery, другое дело что если этот запрос просто скопировать и запустить в окне, то он не выполнится, ругается на маску. Возможно оракл принимает вместе с openquery настройки NLS MS SQL и на основе их уже обрабатывает запрос и отправляет обратно в MS SQL
4 авг 11, 12:52    [11070126]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить