Grafana timestamp macro to use with QuestDB - grafana

Grafana $__timeFilter(timestamp) macro generates nanosecond precision (for some reason, only on the alert queries, still trying to work out why). QuestDB accepts either epoch microseconds or ISO timestamps strings up to microsecond precision e.g. 1656490564000000 or 2022-06-29T08:16:23.123456Z.
How can I make Grafana to generate filter compatible with QuestDB?

Try replacing $__timeFilter(timestamp) with the following filter:
timestamp BETWEEN cast($__unixEpochFrom()*1000000L as timestamp) and cast($__unixEpochTo()*1000000L as timestamp)

(edited) The behaviour you describe sounds weird, as according to the Grafana docs the timeFilter should be consistent. I checked in any case and I am observing the same behaviour.
At QuestDB you can use the to_timestamp function to parse a timestamp with nanoseconds precision, but internally the timestamp is still with microsecond resolution, so you'd need to use the solution suggested by Andrey and skip using the built-in grafana filter here

Related

How to truncate date in postgres?

I am using below condition to truncate date in postgres
to_date(to_char(trunc(appointment_date),'YYYYMMDD')||appointment_end_time,''YYYYMMDDHH24:MI:SS')AS tq
How I can use this in postgres ?
Strange data typing, sometimes requires strange, looking at least, queries. Try (see fiddle)
date_trunc('day',appointment_date)
+ substr(appoinment_end,12)::interval
As your to_char() call uses the format 'HH24:MI:SS' for the "time" column, you can cast that column directly to a time value, e.g. using the :: operator: appointment_end_time::time.
To build a new timestamp from the date part of the appointment_date and the time value, just add them:
appointment_date::date + appointment_end_time::time
So first the timestamp is converted to a date (that does not have a time), and then the time value is added to that, which yields a timestamp.
Note that to_date() returns a date so your code would remove the just added time part again. You would need to use to_timestamp() if you really want a timestamp as the result.
To answer the question's title "how to truncate date in Postgres?" (which in reality refers to a timestamp not a date): you can either cast it to a date (see above) or you can use date_trunc() (not trunc()) with a unit to which it should be truncated. However, date_trunc returns a timestamp not a date value, so you couldn't add a time to the result.

What is the best way to store formatted timestamp in Postgresql

What is the best way to store a timestamp value in Postgresql in a specific format.
For example I would like to store a TIMESTAMP '2020-07-09 17:29:30.873513Z' down to the minute and ignore seconds value.
I can drop the seconds by using date_trunc('minute', TIMESTAMP '2020-07-09 17:29:30.873513Z') Is there anyway for me to specify this format in the column itself when I create a table?
Don't store formatted timestamps in the database, use timestamp with time zone or timestamp without time zone. You would lose powerful datetime arithmetic, value checking and waste storage space.
To have the values truncated to minute precision, use a BEFORE INSERT trigger that uses date_trunc on the value.
If you want to ascertain that only such values are stored, add a check constraint.
I would like to recommend not to drop seconds or anything from the stored data. Because it will create issues while you process the data later. And if you have to eliminate anything, you may eliminate it while retrieving the data.
Use the following code while creation of table
col_name timestamp without time zone DEFAULT timezone('gmt'::text, now())
This will give you a result as shown in the following image:
Good Luck.

Converting bigint to timestamp in presto

I have a column in my dataset that has a datatype of bigint:
Col1 Col2
1 1519778444938790
2 1520563808877450
3 1519880608427160
4 1520319586578960
5 1519999133096120
How do I convert Col2 to the following format:
year-month-day hr:mm:ss
I am not sure what format my current column is in but I know that it is supposed to be a timestamp.
Any help will be great, thanks!
Have you tried to use functions like from_unixtime? You could use it to convert unix time to timestamp, then you could use date_format to display it in way you want. Notice that in your example your unix time is with microseconds, so you might want to convert it first to milliseconds.
I have not tested that but I am assuming that your code should look like:
date_format(from_unixtime(col2/1000), '%Y-%m-%d %h:%i:%s')
Notice that from_unixtime accepts also a time zone.
Please visit this page to see the more details about date related functions: https://docs.starburstdata.com/latest/functions/datetime.html
I believe the denominator should be 1000000 not 1000. Probably a typo. Anyways juts adding the test results here for others reference.
-- Microseconds
select date_format(from_unixtime(cast('1519778444938790' as bigint)/1000000), '%Y-%m-%d %h:%i:%s');
2018-02-28 12:40:44
If you need to filter the data where the column is in BIGINT Unix format, then you can use the following snippet to compare : from_unixtime(d.started_on /1000) >= CAST('2022-05-10 22:00:00' AS TIMESTAMP )
Accepted answer is a bit misleading. You should divide by 1000.0 otherwise you'll lose ms precision and be limited to second precision:
date_format(from_unixtime(col2/1000.0), '%Y-%m-%d %h:%i:%s')

Using Postgres with Grafana

Is it a requirement that you must use a time or datetime column in postgres to pull metric's on a Grafana dashboard?
I ask because I have a column just with a date only and I'm unable to show metrics base on dates only. Unless I am missing something in the documentation. Postgres in Grafana
If anyone has any helpful information, it would be greatly appreciated.
All I need is just a starting point.
I am a new user to Grafana and I'm trying to figure this out.
According to documentation:
If you set Format as to Time series, for use in Graph panel for example, then the query must return a column named time that returns either a sql datetime or any numeric datatype representing unix epoch in seconds.
So, all you need is to convert your column with date to unix epoch and name it as time. You can do it yourself or use macros provided by grafana (see docs) for convertion which are expanded into native postgres expressions. It is also helpful to look at 'Generated SQL' to see the actual query sent to database.

postgres timestamptz timezone wierdness

I'm developing my first postgres database schema and I'm running into a little strangeness with the timezones on the timestamptz data type.
After I create the table and use the now() function to input data into the column, I get 2015-11-17 12:10:05.764088-08 as the result. I don't understand what the "764088-08" means for a time zone marker. The postgres documentation says it should look something like this:
'2004-10-19 10:23:54+02'
I understand the second timezone format, but the first one is a big mystery to me. Am I simply missing something? Is the now() function not what you want to use?
The part 05.764088 refers to the current seconds. It just gives finer precision and returns the exact microseconds(in this case 764088) as well. The -08 in the end refers to the timezone:
The time zone offset from UTC, measured in seconds. Positive values
correspond to time zones east of UTC, negative values to zones west of
UTC. (Technically, PostgreSQL uses UT1 because leap seconds are not
handled.)
The function now() is the traditional PostgreSQL equivalent to CURRENT_TIMESTAMP. You can see exact details in the official documentation.