Какую эквивалентную функцию я должен использовать для своего запроса в OracleDB? - PullRequest
0 голосов
/ 06 марта 2020

Вот предложение where, которое я сейчас использую в Mysql, мне нужно записать это в Oracle с теми же логами c. Столбец consprtydate имеет тип Timestamp (6).

WHERE ( ( rs.liferemaining <= 99999 ) 
   OR ( Abs(( Timestampdiff(hour, pk.consprtydate, rs.consprtydate) / 24 )) >= 1 ) )

Может помочь любой ваш гений, будет очень признателен.

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Функция timestampdiff, согласно документации, в вашем случае возвращает количество часов от pk.consprtydate до rs.consprtydate.

Количество часов, деленное на 24, возвращает число дней между ними.

Итак, почему вы не взяли timestampdiff(day, ...) вместо этого?


В Oracle, когда вы вычитаете два значения типа DATE, вы получаете число дней между ними. Следовательно, это будет

or abs(pk.consprtydate - rs.consprtydate) >= 1
1 голос
/ 07 марта 2020

Столбец consprtydate имеет тип Timestamp(6).

Просто добавьте (или вычтите) литерал INTERVAL:

WHERE (
      rs.liferemaining <= 99999
OR    pk.consprtydate <= rs.consprtydate - INTERVAL '1' DAY
OR    pk.consprtydate >= rs.consprtydate + INTERVAL '1' DAY
)

или используйте GREATEST и LEAST:

WHERE (
      rs.liferemaining <= 99999
OR    pk.consprtydate <= rs.consprtydate - INTERVAL '1' DAY
OR    ( GREATEST( pk.consprtydate, rs.consprtydate )
        - LEAST( pk.consprtydate, rs.consprtydate )
        >= INTERVAL '1' DAY )
)

или вы можете преобразовать значения TIMESTAMP(6) в DATE и затем вычесть, так как по умолчанию это даст разницу в днях (или их долях) :

WHERE (
      rs.liferemaining <= 99999
OR    ABS( CAST( pk.consprtydate AS DATE ) - CAST( rs.consprtydate AS DATE ) ) >= 1
)

(Однако, если вы заботитесь о долях секунды, тогда этот последний параметр может дать некоторые недействительные ответы, когда значение TIMESTAMP усекается до DATE и теряет доли секунды. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...