2015-01-08 2 views
4

Мне нужна метка времени как целое число (пожалуйста, НЕ спрашивайте меня, почему, меня это полностью беспокоит). Определение - это количество секунд после 01.01.1970, как обычно.Создайте целую временную метку в Firebird

То, что я как щёток значение является строкой с форматом

YYYYMMDDHHMMSS (например, 20140108154821)

Я был в состоянии построить нормальную временную метку

CAST(
(SUBSTRING (t.thetime FROM 5 FOR 2)||'/'||SUBSTRING (t.thetime FROM 7 FOR 2)||'/'||SUBSTRING (t.thetime FROM 1 FOR 4)||' ' ||SUBSTRING (t.thetime FROM 9 FOR 2)||':'||SUBSTRING (t.thetime FROM 11 FOR 2)||':'||SUBSTRING (t.thetime FROM 13 FOR 2)||'.00' 
) AS TIMESTAMP) 

Тогда я попытался для его литья в инт с использованием этой техники

CAST(cast(
(SUBSTRING (t.thetime FROM 5 FOR 2)||'/'||SUBSTRING (t.thetime FROM 7 FOR 2)||'/'||SUBSTRING (t.thetime FROM 1 FOR 4)||' '|| SUBSTRING (t.thetime FROM 9 FOR 2)||':'||SUBSTRING (t.thetime FROM 11 FOR 2)||':'||SUBSTRING (t.thetime FROM 13 FOR 2)||'.00' 
) AS TIMESTAMP) 
-cast('01/01/1970 00:00:00' as timestamp) as BIGINT) as TIMESTAMP_INT 

Я делаю получить целое число, но похоже, что возвращаемое значение - это количество дней или что-то в этом роде.

например. 08.01.2015, 16: 33: 01.114 становится 16444

Любые предложения, почему это происходит или есть ли другой способ сделать это?

Я использую Firebird версии 2.5

Спасибо заранее

PS:

SELECT 
CAST(cast(
    (SUBSTRING ('20140108154821' FROM 5 FOR 2)||'/'||SUBSTRING ('20140108154821' FROM 7 FOR 2)||'/'||SUBSTRING ('20140108154821' FROM 1 FOR 4)||' ' 
    || 
    SUBSTRING ('20140108154821' FROM 9 FOR 2)||':'||SUBSTRING ('20140108154821' FROM 11 FOR 2)||':'||SUBSTRING ('20140108154821' FROM 13 FOR 2)||'.00' 
    ) AS TIMESTAMP) 
    -cast('01/01/1970 00:00:00' as timestamp) as BIGINT) 
    from sometable 

; 

ответ

3

Один из способов сделать это состоит в использовании DATEDIFF:

SELECT DATEDIFF(second, TIMESTAMP'1970-01-01 00:00', CURRENT_TIMESTAMP) 
FROM RDB$DATABASE 

Это предполагает, что время UTC, в противном случае может возникнуть необходимость смещения от временной зоны смещения для компенсации (например, для СЕТА (UTC + 1), вместо этого вы должны использовать TIMESTAMP'1970-01-01 01:00').

+0

Большое спасибо, после некоторого тестирования это подход, который работает для меня :) – confusedandtired

1

Да, когда вы вычесть два временных меток, то ответ количество дней между ними. Так что вы хотите сделать, это вычесть метку «большого взрыва» из вашей временной метки, а затем умножить на количество секунд в день, т.е.

SELECT floor((yourTIMESTAMP - cast('1970-01-01' as TIMESTAMP)) * 86400) 
FROM rdb$database 

заменить yourTIMESTAMP с вашим кодом, который превращает строку в метку времени константа 86400 - это количество секунд в день.

+0

О, спасибо большое: D Я проверю его прямо сейчас – confusedandtired

+0

Этот метод игнорирует каждый блок меньше, чем за день – confusedandtired

+0

Нет, он должен работать нормально. Например, при вычитании «1970-01-01» с «1970-01-01 12:00» результат равен 0,5 (т. Е. Полдня = 12 часов). – ain

Смежные вопросы