Как усечь дату до секунд в Oracle

Эта страница упоминает, как обрезать временную метку до минут / часов и т. д. в Oracle.

Как бы вы таким же образом усекали метку времени до секунд?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
14
0
56 132
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Поскольку точность DATE составляет до секунды (а не доли секунды), TRUNC вообще не нужен.

Тип данных TIMESTAMP позволяет использовать доли секунды. Если вы конвертируете его в DATE, доли секунды будут удалены - например,

select cast(systimestamp as date) 
  from dual;

Я не понимаю, почему это так много голосов и было выбрано в качестве ответа. Не работает, по крайней мере, в 12c. Оригинальный пост был в 2008 году - может, тогда он и сработал. Сегодня в 12c он возвращает полную дату со временем, включая секунды. select cast(systimestamp as date) from dual; возвращает 12/27/2019 7:54:35 AM

alexherm 27.12.2019 18:55

Да как надо. Но не фракции секунд, например. 12/27/2019 7:54:35.534648.

Tony Andrews 27.12.2019 19:48

Ах я вижу. Я неверно истолковал вопрос, как OP может обрезать секунды после даты. Такое, что вернет 12/27/2019 7:54

alexherm 27.12.2019 21:00

Я бы хотел, но для этого нужно отредактировать ответ.

alexherm 27.12.2019 22:46

@alexherm ОК, достаточно честно. Но я не буду редактировать его, потому что за 11 лет был только один человек, который не понял, что «доли секунды будут удалены» не означает, что «будут удалены целые секунды» :-)

Tony Andrews 31.12.2019 13:10

Чтобы усечь timestamp до секунд, вы можете преобразовать его в дату:

CAST(timestamp AS DATE)

Чтобы затем выполнить TRUNC в статье:

TRUNC(CAST(timestamp AS DATE), 'YEAR')

По общей теме усечения дат Oracle, вот ссылка на документацию для моделей формата, которые могут использоваться в функциях date trunc () И round ()

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions242.htm#sthref2718

«Секунды» не указаны, поскольку степень детализации типа данных DATE составляет секунды.

Что-то вроде:

select to_char(current_timestamp, 'SS') from dual;

Хотя это наиболее очевидное решение, SS не является допустимым форматом для to_char и не работает с ORA-01899: bad precision specifier. Он также не указан как приемлемый вариант на: docs.oracle.com/cd/B19306_01/server.102/b14200/…

Jan-Willem Gmelig Meyling 22.08.2019 20:48

Интересно. В моем случае все работает нормально. Я использую 64-разрядную версию 12c (12.2.0.1.0). Ваша ссылка идет в Trunc / Round. В примере используется to_char. попробуйте techonthenet.com/oracle/functions/to_char.php

EvilTeach 22.08.2019 21:53

Хм, значит должно быть исправлено в более свежей версии ... Попробую привязать к конкретной версии.

Jan-Willem Gmelig Meyling 22.08.2019 21:54

Я использовал такую ​​функцию:

FUNCTION trunc_sec(p_ts IN timestamp)
IS
    p_res timestamp;
BEGIN
    RETURN TO_TIMESTAMP(TO_CHAR(p_ts, 'YYYYMMDDHH24MI'), 'YYYYMMDDHH24MI');
END trunc_sec;

Я думаю, что это правильный путь, поскольку, в отличие от большинства этих ответов, он не зависит от версии Oracle. Но это не совсем правильно - вы упустили секунды. Должно быть что-то вроде: to_date (to_char (systimestamp, 'YYYY-MM-DD HH24: MI: SS'), 'YYYY-MM-DD HH24: MI: SS')

delany 02.08.2013 18:49

Мне очень жаль, но все мои предшественники, кажется, ошибались.

select cast(systimestamp as date) from dual 

..не обрезает, а вместо этого округляет до следующей секунды.

Я использую функцию:

CREATE OR REPLACE FUNCTION TRUNC_TS(TS IN TIMESTAMP) RETURN DATE AS
BEGIN

    RETURN TS;

END;

Например:

SELECT systimestamp
    ,trunc_ts(systimestamp) date_trunc
    ,CAST(systimestamp AS DATE) date_cast 
FROM dual;

Возврат:


    SYSTIMESTAMP                       DATE_TRUNC             DATE_CAST
    21.01.10 15:03:34,567350 +01:00    21.01.2010 15:03:34    21.01.2010 15:03:35

Я запустил ваш код, но не могу воспроизвести ваши выводы. В нескольких десятках тестов (на большинство из которых повлияло округление) секундная часть никогда не различалась между тремя результатами. На какой версии Oracle вы работаете? (Я был 11.2).

Leigh Riffel 24.11.2010 19:07

CAST будет округляться до версии 11i и усекаться после. См. [Неявное преобразование данных] (docs.oracle.com/cd/E11882_01/server.112/e26088/…) в документации Oracle HTML.

Sulihin 28.02.2012 20:29

trunc работает только до min, приведено к дате to_char(START_TIME,'YYYYMMDDHH24MISS')

или просто select to_char(current_timestamp, 'YYYYMMDDHH24MISS') from dual;

https://www.techonthenet.com/oracle/functions/trunc_date.php

Другие вопросы по теме