LINUX.ORG.RU

unix MICRO time

 


1

1

Вот так можно получить unixtime:

SELECT EXTRACT(EPOCH FROM NOW())::bigint AS UNIXTIME;
  unixtime  
------------
 1426694898

А как получить unixmicrotime средствами postgresql, без парсинга на клиенте? Postgresql в своем типе timestamp хранит время с точностью до миллисекунд.

★★★★
Ответ на: комментарий от Sorcerer

да спасибо!

но оно вытаскивает текущие микросекунды с секундами:

select EXTRACT(MICROSECONDS FROM '2015-03-19 09:50:55.607533+03'::timestamp);
 date_part 
-----------
  55607533

нужно все это еще как то преобразовать чтобы были не текущие микросекунды а микросекунды прошедшие с 1970 года

quest ★★★★
() автор топика
Последнее исправление: quest (всего исправлений: 1)
Ответ на: комментарий от quest

Да точно *1000000 — extract(epoch FROM now()) это не целое число, миллисекунды там точно есть. На счёт микросекунд не уверен.

Evgueni ★★★★★
()
Последнее исправление: Evgueni (всего исправлений: 1)

Кстати, если не секрет, то зачем?

Evgueni ★★★★★
()
Ответ на: комментарий от quest
select EXTRACT(EPOCH FROM '2015-03-19 09:50:55.607533+03'::timestamp) * 1000000::bigint + EXTRACT(MICROSECONDS FROM '2015-03-19 09:50:55.607533+03'::timestamp)::bigint - (trunc(EXTRACT(MICROSECONDS FROM '2015-03-19 09:50:55.607533+03'::timestamp)/1000000)*1000000::bigint);
Sorcerer ★★★★★
()

без парсинга на клиенте?

Это смотря что понимать под парсингом. Если сначала просить постгрес конвертировать время в строку, а затем парсить эту строку, то это убиццо можно. Поэтому я в своей либке (на Си) запрашиваю у постгреса бинарные данные, а затем преобразую их сам в нужный мне тип. Так микросекунды доступны без извращений с extract, да и вообще запрос выглядит красиво и относительно переносимо - просто SELECT NOW(); (зато есть другие извращения с точки зрения парсинга, но это опустим).

Sorcerer ★★★★★
()

вот так можно получить время с 1970 года в грязном виде:

select EXTRACT(EPOCH FROM '2015-03-19 09:50:55.607533+03'::timestamp);
    date_part     
------------------
 1426758655.60753

вот так можно получить время с 1970 года с округлением до целого, те UNIXTIME:

select EXTRACT(EPOCH FROM '2015-03-19 09:50:55.607533+03'::timestamp)::bigint;
 date_part  
------------
 1426758656

вот так можно получить время с 1970 года в миллисекундах так же как и хранит timestamp, те UNIXMICROTIME:

select (EXTRACT(EPOCH FROM '2015-03-19 09:50:55.607533+03'::timestamp) * 1000000)::bigint;
       int8       
------------------
 1426758655607533

Может кому пригодится. Evgueni Sorcerer

quest ★★★★
() автор топика
Последнее исправление: quest (всего исправлений: 1)
Ответ на: комментарий от quest

Во, только недавно ковырял про то-же самое в мускуле. И там это в старых версиях «ниалё», т.е. хранить с долями секунд никто не запрещает, а вот получить текущее значение — хрен.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

mysql лучше вообще не использовать но это уже другая история

quest ★★★★
() автор топика
Ответ на: комментарий от quest

вот так можно получить время с 1970 года в миллисекундах так же как и хранит timestamp, те UNIXMICROTIME

Да, я выше с тремя extract явно перемудрил. :)

Sorcerer ★★★★★
()
9 июля 2015 г.
Ответ на: комментарий от quest

В продолжении темы обратное преобразование в timestamp:

SELECT (timestamp 'epoch' + (interval '1 s' * (1426758655607533/1000000)) + (interval '1 microseconds' * (1426758655607533 - ((1426758655607533/1000000)*1000000))))::timestamptz;
          timestamptz          
-------------------------------
 2015-03-19 09:50:55.607533+03
quest ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.