Вы можете использовать numeric_limits<float>::quiet_NaN( )
, определенные в стандартной библиотеке limits
для тестирования. Для double
существует отдельная константа.
#include <iostream>
#include <math.h>
#include <limits>
using namespace std;
int main( )
{
cout << "The quiet NaN for type float is: "
<< numeric_limits<float>::quiet_NaN( )
<< endl;
float f_nan = numeric_limits<float>::quiet_NaN();
if( isnan(f_nan) )
{
cout << "Float was Not a Number: " << f_nan << endl;
}
return 0;
}
Я не знаю, работает ли это на всех платформах, поскольку я тестировал только с g ++ в Linux.
Вместо усечения даты вы хотите отформатировать дату. Вы должны быть в состоянии отформатировать время с помощью следующего запроса:
SELECT
actor_id AS SRT_ID,
shift_date,
DATE_FORMAT(from_unixtime(shift_start), '%H:%i') AS login,
DATE_FORMAT(from_unixtime(shift_end), '%H:%i') AS logout
FROM
fct_rep_schedule_details
WHERE
ds BETWEEN '2018-12-01' AND '2019-01-15'
GROUP BY 1,2,3,4
где %H
переводится в часы в 00 .. 23 и %i
в минуты в соответствии с документацией prestoDB [ 113]
Вы не хотите урезать дату. Вы хотите извлечь час / время. Вы можете извлечь время, используя cast()
:
SELECT actor_id AS SRT_ID,
shift_date,
DATE_TRUNC('hour', from_unixtime(shift_start)) AS login,
DATE_TRUNC('hour', from_unixtime(shift_end)) AS logout,
CAST(from_unixtime(shift_start) as time) AS login_hh,
CAST(from_unixtime(shift_end) as time) AS logout_hh,
FROM fct_rep_schedule_details
WHERE ds BETWEEN '2018-12-01' AND '2019-01-15';
Если вы хотите контролировать форматирование времени, используйте to_char()
:
SELECT actor_id AS SRT_ID,
shift_date,
DATE_TRUNC('hour', from_unixtime(shift_start)) AS login,
DATE_TRUNC('hour', from_unixtime(shift_end)) AS logout,
TO_CHAR(from_unixtime(shift_start), 'HH:MI') AS login_hh,
TO_CHAR(from_unixtime(shift_end), 'HH:MI') AS logout_hh,
FROM fct_rep_schedule_details
WHERE ds BETWEEN '2018-12-01' AND '2019-01-15';