powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как в запросе получить разность дат?
36 сообщений из 36, показаны все 2 страниц
Как в запросе получить разность дат?
    #36899114
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно узнать сколько секунд прошло с даты, хранящейся в поле таблицы.
Вот такая конструкция не работает, возвращает 0 строк.
Код: plaintext
1.
SELECT DATEDIFF('ss',UPDSTMP,GETDATE()) FROM VOUHDR
Проблема, как я понимаю, в разных типах: GETDATE() - это %Timestamp, а UPDSTMP - это на самом деле %Date.
С конвертацией типов тоже ничего не срослось пока, вот так опять же 0 строк:
Код: plaintext
1.
SELECT {fn CONVERT(UPDSTMP,SQL_TIMESTAMP)} FROM VOUHDR
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899139
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CAST работает, но толку нет.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899200
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8Нужно узнать сколько секунд прошло с даты, хранящейся в поле таблицы.
Какие значения хранятся в том поле? Сравнивать с текущей датой?
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899323
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8 , например такое вот

Код: plaintext
1.
SELECT DISTINCT DATEDIFF('ss','1999-01-01 00:00:00',CURRENT_TIMESTAMP)
FROM Sample.Person

таки работает...
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899340
Странно, datediff очень толерантно относится к представлению входных дат.

Код: plaintext
1.
2.
-- +$h = 62013 (14/10/2010) 
SELECT datediff('ss',  62013 , {fn now}) _now, datediff('ss',  62013 , getdate()) _getdate
#_now_getdate14615646156

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

а у меня не работает :(
что-то не так с этим полем, по которому сравниваем (UPDSTMP оно называется у меня)
имеет тип %Date, на вид выглядит примерно так: 2009-09-01 10:49:30.0
Вообще это прилинкованная таблица из Оракла, если это чем-то поможет.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899603
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8на вид выглядит примерно так: 2009-09-01 10:49:30.0
Прям как тиместамп... А сам пример (мой) в семплс работает?
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899639
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsacoder1cv8на вид выглядит примерно так: 2009-09-01 10:49:30.0
Прям как тиместамп... А сам пример (мой) в семплс работает?
Ага, Ваш пример работает...
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899651
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
coder1cv8что-то не так с этим полем, по которому сравниваем (UPDSTMP оно называется у меня)
имеет тип %Date, на вид выглядит примерно так: 2009-09-01 10:49:30.0
Вообще это прилинкованная таблица из Оракла, если это чем-то поможет.
Попробуйте вручную изменить тип данных в классе Cache, сгенерированном для этой таблицы, с %Date на %TimeStamp и перекомпилировать класс.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899738
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Turk,

Перекомпилировал класс с указанием типа поля %TimeStamp
Запрос
Код: plaintext
1.
SELECT DISTINCT DATEDIFF('ss',UPDSTMP,CURRENT_TIMESTAMP) FROM VOUHDR
все равно не работает!
Если просто посмотреть таблицу, то записи с датой в этом поле я так же вижу.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899819
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPDSTMP смотрите в логическом представлении?
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899826
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что будет в
Код: plaintext
SELECT UPDSTMP,string(UPDSTMP),DATEDIFF('ss',UPDSTMP,CURRENT_TIMESTAMP), DATEDIFF('ss',string(UPDSTMP),CURRENT_TIMESTAMP) FROM VOUHDR
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899920
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.UPDSTMP смотрите в логическом представлении?
Смотрел в ODBC, в логическом будет так: 2009-09-01 10:49:30
Блок А.Н.что будет в
Код: plaintext
SELECT UPDSTMP,string(UPDSTMP),DATEDIFF('ss',UPDSTMP,CURRENT_TIMESTAMP), DATEDIFF('ss',string(UPDSTMP),CURRENT_TIMESTAMP) FROM VOUHDR

будет 0 записей. Использование DATEDIFF в любом виде дает пустой результат запроса. Как сейчас заметил, такой запрос тоже пустой результат возвращает:
Код: plaintext
1.
SELECT string(UPDSTMP) FROM VOUHDR
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36899995
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
coder1cv8будет 0 записей. Использование DATEDIFF в любом виде дает пустой результат запроса. Как сейчас заметил, такой запрос тоже пустой результат возвращает:
Код: plaintext
1.
SELECT string(UPDSTMP) FROM VOUHDR

Надеюсь, такой запрос:
Код: plaintext
1.
SELECT * FROM VOUHDR
вернет записи? Если да, то что будет в поле UPDSTMP? Если нет, то попробуйте выполнить этот же запрос с помощью внешней программы, напрямую подключившись к ODBC.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36900036
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Turk
Надеюсь, такой запрос:
Код: plaintext
1.
SELECT * FROM VOUHDR
вернет записи? Если да, то что будет в поле UPDSTMP? Если нет, то попробуйте выполнить этот же запрос с помощью внешней программы, напрямую подключившись к ODBC.
Да, я же говорю, что просто если UPDSTMP смотреть, то оно выводится без проблем. Что будет в UPDSTMP, я писал выше, если Logical Mode то 2009-09-01 10:49:30
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36900227
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, все-таки погодите.
0 записей скорее всего потому, что происходит ошибка. Какой SQLCODE?

Что дадут запросы:
SELECT string(UPDSTMP) FROM VOUHDR

select DATEDIFF('ss',string(UPDSTMP),CURRENT_TIMESTAMP) from VOUHDR
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36900678
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.Нет, все-таки погодите.
0 записей скорее всего потому, что происходит ошибка. Какой SQLCODE?

Что дадут запросы:
SELECT string(UPDSTMP) FROM VOUHDR

select DATEDIFF('ss',string(UPDSTMP),CURRENT_TIMESTAMP) from VOUHDR
Окей :) Отвечаю подробно.
Первый запрос: SQLCODE: 100 Количество строк: 0
Второй запрос: SQLCODE: 100 Количество строк: 0

А вот так:
[src]
select UPDSTMP from VOUHDR
[src]
все работает на ура.
# UPDSTMP
1 2009-09-01 10:49:30
2 2009-09-01 10:50:39
3 2009-09-01 11:52:32
4 2009-09-01 12:08:09
5 2009-09-01 12:10:55
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36900695
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8Вообще это прилинкованная таблица из Оракла, если это чем-то поможет.
Вы пытаетесь использовать SQL-функции Caché в БД Oracle. При работе с прилинкованной таблицей действует синтаксис той СУБД, к которой она относится.
В СУБД Oracle нет функции DATEDIFF, поэтому Ваш запрос не работает.
Попробуйте поискать решение в соседней ветке.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36900730
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,

вот как.... Спасибо ) А я-то думал это какое-то... эм... представление таблицы в Каше, судя по тому что для нее Persistent класс создается с типами Каше. А тут оказывается все по-другому.
Осталось разобраться как эта задача в Oracle решается )
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36900806
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8А я-то думал это какое-то... эм... представление таблицы в Каше, судя по тому что для нее Persistent класс создается с типами Каше.
Представление внешней таблицы в Caché может быть осуществлено с помощью:
1) связывание (линкования) таблицы;
2) миграции таблицы, включая структуру и данные.

Во втором случае данные хранятся непосредственно в Caché, поэтому Вы можете использовать возможности Caché SQL в полном объёме.
Использование Caché SQL Шлюза
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36900820
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,

ага, понятно ) спасибо еще раз за разъяснения.

ЗЫ: не поддается все-таки пока мне разность дат, в оракловом синтаксисе работает, но возвращает не совсем понятно что )
Код: plaintext
1.
select (sysdate-UPDSTMP)* 24 * 60 * 60  as sec from VOUHDR
9109 7:26:20.371200000
9064 7:26:20.371200000
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36901008
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8в оракловом синтаксисе работает, но возвращает не совсем понятно что )

Что-то мне подсказывает что это

Количество дней время9109 7:26:20.371200000 9064 7:26:20.371200000
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36901075
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
Что-то мне подсказывает что это

Количество дней время9109 7:26:20.371200000 9064 7:26:20.371200000
Не ) Это кол-во секунд (то что мне нужно) + какое-то не понятное время...
Код: plaintext
1.
select UPDSTMP, sysdate as currentDate ,(sysdate-UPDSTMP)* 24 * 60 * 60  as sec
UPDSTMP currentDate sec2010-10-15 08:19:02 2010-10-15 11.56.29.724071000 4:0 13047 17:22:39.734400000 2010-10-15 08:19:47 2010-10-15 11.56.29.724071000 4:0 13002 17:22:39.734400000
Вот такие пироги. Я бы получал нормальное время в секундах при обходе RecordSet-a (так как функции Каше у нас в этом запросе не доступны), но проблема в том, что мне нужен отбор по этой разности, т.е. к примеру, записи за последние 30 сек.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36901094
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8 , в любом слечае наверное нужно ораклистов теребить...
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36902053
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

А что их теребить? В Оракле запрос:
Код: plaintext
1.
SELECT (sysdate-UPDSTMP)* 24 * 60 * 60  FROM VOUHDR
работает! И возвращает кол-во секунд без всяких выкрутасов. Проблема в Каше.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36902080
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, не проще ли так:
- написать хранимку в Оракле
- вызывать ее из Cache через SQL-шлюз.
Подход, проверенный временем :), и безопасность выше.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36902104
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Maslov,

не проще )
"база на Оракл" это часть внешней системы, к которой я доступа не имею, по большему счету.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36902428
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно...
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36902816
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
coder1cv8В Оракле запрос:
Код: plaintext
1.
SELECT (sysdate-UPDSTMP)* 24 * 60 * 60  FROM VOUHDR
работает! И возвращает кол-во секунд без всяких выкрутасов. Проблема в Каше.
А что возвращает этот же запрос при использовании внешней программы (ODBCView, SQLExplorer и т.п.)? Если возвращает то же, что и при выполнении из Оракла, то действительно проблема в Cache. Если же возвращает "плохой" (не устраивающий вас) результат, то Cache здесь не при чем.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36904608
hooligun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прочитал топик - пробовали пользовать to_date(переменная, 'YYYY-MM-DD')?
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36904805
HooliGUN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hooligunпрочитал топик - пробовали пользовать to_date(переменная, 'YYYY-MM-DD')?

вот так SELECT DATEDIFF('ss',UPDSTMP,to_date(GETDATE(), 'YYYY-MM-DD')) FROM VOUHDR

to_date вернет данные %Date
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36904996
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HooliGUN,

DATEDIFF нет в Oracle )

Вроде разобрался! Проблема была в разных типах текущей даты и поля с датой из таблицы (наверное).
Вот так работает:
Код: plaintext
SELECT CAST((CURRENT_DATE-UPDSTMP)* 60 * 60 * 24  AS INTEGER) AS sec FROM VOUHDR

Но теперь есть другая проблема. Вот вроде бы выяснили, что если таблица линкованная то нужно писать запрос на sql-диалекте той базы к которой линкуем. Но почему функции (в данном случае Оракла) работают выборочно?? Например, TO_DATE доступна:
Код: plaintext
SELECT TO_DATE('2010-10-18','YYYY-MM-DD') AS sec FROM VOUHDR
а TRUNC уже нет:
Код: plaintext
SELECT TRUNC(CURRENT_DATE,'DAY') FROM VOUHDR
ОШИБКА #5540: SQLCODE: -359 Сообщение: Пользовательская SQL-функция 'SQLUSER.TRUNC' не существует
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36905020
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, to_date() есть в оракле.
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36905749
HooliGUN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
coder1cv8HooliGUN,

DATEDIFF нет в Oracle )

Вроде разобрался! Проблема была в разных типах текущей даты и поля с датой из таблицы (наверное).
Вот так работает:
Код: plaintext
SELECT CAST((CURRENT_DATE-UPDSTMP)* 60 * 60 * 24  AS INTEGER) AS sec FROM VOUHDR

Но теперь есть другая проблема. Вот вроде бы выяснили, что если таблица линкованная то нужно писать запрос на sql-диалекте той базы к которой линкуем. Но почему функции (в данном случае Оракла) работают выборочно?? Например, TO_DATE доступна:
Код: plaintext
SELECT TO_DATE('2010-10-18','YYYY-MM-DD') AS sec FROM VOUHDR
а TRUNC уже нет:
Код: plaintext
SELECT TRUNC(CURRENT_DATE,'DAY') FROM VOUHDR
ОШИБКА #5540: SQLCODE: -359 Сообщение: Пользовательская SQL-функция 'SQLUSER.TRUNC' не существует

должно работать SELECT {fn TRUNCATE(CURRENT_DATE,'DAY')} FROM VOUHDR
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36906758
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8,

Если с помощью связанной таблицы не удаётся получить нужный результат, есть возможность программно выполнить нужный Вам SQL-код, используя Java-Шлюз.
Например:
Пример
Class oracle.test Extends %RegisteredObject
{
ClassMethod Test(host As %String = "127.0.0.1",port As %Integer = {$$$JDBCGatewayPort}) As %Status
{
  #dim exception As %Exception.StatusException
  set url="jdbc:oracle:thin:@oracleserver:oracleport:scott"
  set username="логин"
  set password="пароль"
  #dim classPath As %ListOfDataTypes=##class(%ListOfDataTypes).%New()
  ; каталог с jar-файлами драйвера Oracle
  do classPath.Insert("C:\JDBC\Oracle\")
  try {
    #dim gateway As %Net.Remote.Gateway=##class(%Net.Remote.Gateway).%New()
    ; подключаемся к шлюзу
    $$$TOE(status,gateway.%Connect(host,port,,,classPath))
    $$$TOE(status,gateway.%ClassForName("oracle.jdbc.OracleDriver"))

    #dim connection As java.sql.Connection=##class(java.sql.DriverManager).getConnection(gateway,url,username,password)
    #dim statement As java.sql.Statement=connection.createStatement()
    #dim rs As java.sql.ResultSet=statement.executeQuery("select ID,UPDSTMP,(SYSDATE-UPDSTMP)*24*60*60 from VOUHDR")
    #dim rsMetaData As java.sql.ResultSetMetaData=rs.getMetaData()
    write !,"Выполнение запроса",!
    write "==============================================",!
    for i=1:1:rsMetaData.getColumnCount() write rsMetaData.getColumnName(i),?$x+10

    write !,"----------------------------------------------",!
    while (rs.next()) {
      for i=1:1:rsMetaData.getColumnCount() write rs.getString(i),?$x+10
    }
    write !,"----------------------------------------------",!

    $$$TOE(status,gateway.%Disconnect())
  } catch exception {
    ; выводим текст ошибки на русском языке
    write $system.Status.GetErrorText(exception.AsStatus(),"ru")
  }
}
}

Программное использование JDBCGateway
...
Рейтинг: 0 / 0
Как в запросе получить разность дат?
    #36906917
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем!
{fn TRUNCATE(CURRENT_DATE,'DAY')} - работает.

Отдельное спасибо за пример с Java-шлюзом )
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как в запросе получить разность дат?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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