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


Поскольку точность DATE составляет до секунды (а не доли секунды), TRUNC вообще не нужен.
Тип данных TIMESTAMP позволяет использовать доли секунды. Если вы конвертируете его в DATE, доли секунды будут удалены - например,
select cast(systimestamp as date)
from dual;
Да как надо. Но не фракции секунд, например. 12/27/2019 7:54:35.534648.
Ах я вижу. Я неверно истолковал вопрос, как OP может обрезать секунды после даты. Такое, что вернет 12/27/2019 7:54
Я бы хотел, но для этого нужно отредактировать ответ.
@alexherm ОК, достаточно честно. Но я не буду редактировать его, потому что за 11 лет был только один человек, который не понял, что «доли секунды будут удалены» не означает, что «будут удалены целые секунды» :-)
Чтобы усечь 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/…
Интересно. В моем случае все работает нормально. Я использую 64-разрядную версию 12c (12.2.0.1.0). Ваша ссылка идет в Trunc / Round. В примере используется to_char. попробуйте techonthenet.com/oracle/functions/to_char.php
Хм, значит должно быть исправлено в более свежей версии ... Попробую привязать к конкретной версии.
Я использовал такую функцию:
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')
Мне очень жаль, но все мои предшественники, кажется, ошибались.
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).
CAST будет округляться до версии 11i и усекаться после. См. [Неявное преобразование данных] (docs.oracle.com/cd/E11882_01/server.112/e26088/…) в документации Oracle HTML.
trunc работает только до min, приведено к дате to_char(START_TIME,'YYYYMMDDHH24MISS')
или просто select to_char(current_timestamp, 'YYYYMMDDHH24MISS') from dual;
https://www.techonthenet.com/oracle/functions/trunc_date.php
Я не понимаю, почему это так много голосов и было выбрано в качестве ответа. Не работает, по крайней мере, в 12c. Оригинальный пост был в 2008 году - может, тогда он и сработал. Сегодня в 12c он возвращает полную дату со временем, включая секунды.
select cast(systimestamp as date) from dual;возвращает12/27/2019 7:54:35 AM