php mysql select date from 1 day ago, upto the minute - php

I want to capture data that took place at the same hour and minute 24 hours ago. the formula below does not work. what could be the truth?
I will draw the date range in a single line, not listing.
$now=time();
$24hrb=$now-(24*60*60);
$que = $connc->query("select * from table where datetime='$24hrb';")

In my opinion it would be best to do this all in SQL. You can use the mysql intervals options to reduce by 1 day then like and substr to trim the seconds off and only pull the datetime through the minute value.
select * from table where datetime like concat(substr((now() - interval 1 day), 1, 16), '%')
The substr is taking from a string like this:
2021/01/22 11:12:21
^ ^
and concat throws the wildcard on the end so anything after that matches. So your like is processed as:
2021/01/22 11:12%

$24hrb=time() - (24*60*60);
This is a Timestamp value. But you state in comments:
yes. datetime format Y-m-d H:i:s
So what you actually should be doing if you insist on using this method is converting your datetime to a Unix timestamp:
$que = $connc->query("SELECT * FROM table
WHERE UNIX_TIMESTAMP(`datetime_column`) = '".(int)$24hrb."'");
This is much better and easier to read than messing around with concatenations and string manipulations.
Further,
You can extend this action using the MySQL BETWEEN keyword so that you can get the values found between the range of times, say +/- 30 seconds. so:
$que = $connc->query("SELECT * FROM table
WHERE UNIX_TIMESTAMP(`datetime_column`)
BETWEEN ".($24hrb - 30)." AND ".($24hrb + 30));

Related

PHP Oracle substraction from current row with previous row

I have data like below:
Time | Count
17:31:49
17:35:52
17:36:54
17:38:12
17:39:12
17:40:12
17:41:57
17:43:47
17:45:27
17:48:12
17:48:17
Now I need to subtraction current row with previous row.
So this will be like this:
Time | Count
17:31:49 formula: 17:35:52 - 17:31:49 = 04:03
17:35:52 formula: 17:36:54 - 17:35:52 = 01:02
17:36:54 formula: 17:38:12 - 17:36:54 = 01:58
17:38:12 and so on
17:39:12
17:40:12
17:41:57
17:43:47
17:45:27
17:48:12
17:48:17
Is it possible to do the calculation only using query or need PHP (I'm using this) to do that?
Basically, you can use lead():
select time, lead(time) over(order by time) - time diff
from mytable
It is unclear what the datatype of time is. If it is a DATE, then you can substract, and you get a decimal number representing the difference in days; you can format or use arithmetics to get the results you desire.
If it is of some other datatype (a string?), then you need to build your own logic to handle the substraction.

Cannot figure out php date() timestamps for two timestamps

With PHP, I am trying to convert a bunch of numbers into a a readable format, the thing is, I have no idea how/what format these are in or can be parsed in using the date() or time() functions in php. there are two of these as well.
(they're built from a total time spent online and time since last log-on)
onlinetime : 1544946 = 2w 3d 21h 9m
lastonline : 1397087222 = 1h 32m
does anyone know the way to get the two different times from the two different timestamps?
If you have a Unix timestamp, take a look at Convert timestamp to readable date/time PHP. The PHP documentation is here: http://php.net/manual/en/function.date.php.
For the online time, you could do modulo arithmetic to figure out the values for each, and then just make a string out of the result. Someone may have a nicer suggestion for this though.
I think John is right, the first is the number of seconds in the timespan listed. And the second certainly looks like a unix timestamp to me. So here's how you can get what you want from these sets of numbers:
1) For the first number, simply divide the number by the seconds in a given time span and use floor():
$timeElapsed = 154496; // in this case
$weeksElapsed = floor($timeElapsed / 604800);
$remainder = $timeElapsed % 604800;
$daysElapsed = floor($remainder / 86400);
etc...
2) For the second number, you can do the same thing by first getting the current timestamp and then subtracting the given timestamp from it:
$lastOnline = 1397087222; // again, in this case
$currentTimestamp = time();
$elapsedSinceLastLogin = $currentTimestamp - $lastonline;
$weeksSinceLastLogin = floor($elapsedSinceLastLogin / 604800);
etc...

Why isnt my MySQL BETWEEN operator not working?

MySQL table "flightSched" is connected to time, similar to the one below:
flightNo |day |time |arrivalTimeSec
=============================================
WERE112 |Tuesday | 1:00 |1381186800
FGHG234 |Tuesday |23:00 |1381266000
CGHF345 |Tuesday |00:00 |1381183200
I have a mysql query that select all data between two times. This is the query:
$CurrentTimeMinus30min = date('H:i', strtotime('-30 minutes')); //Current Time minus 30minutes
$CurrentTimeMinus30min = strtotime($CurrentTimeMinus30min);
$CurrentTimePlus4Hours = date('H:i', strtotime('+240 minutes')); //Current Time plus 4 hours
$CurrentTimePlus4Hours = strtotime($CurrentTimePlus4Hours);
$query = $mysqli->query("
SELECT * FROM flightSched
WHERE day = '$currentDay'
AND arrivalTimeSec
BETWEEN '$CurrentTimeMinus30min'
AND '$CurrentTimePlus4Hours'
");
I was advised to used strtotime() function on the time values to be able to use them in a BETWEEN MySQL query. This doesn't seem to be working at all.
Where am I going wrong with this query? Any help will be appreciated.
today I found the same problem with yours (mine about coordinates).
and I found out that in some case, a BETWEEN operator can only be used like this
..... WHERE columname BETWEEN smallervalue AND biggervalue
previously I've tried with the biggervalue at front since I dealt with negative numbers, and it fails.
you might found the same problem with your timestamp.
strtotime returns a timestamp so passing that into the MySQL query, like above, won't work. Try using FROM_UNIXTIME instead.
$query = $mysqli->query("SELECT * FROM flightSched
WHERE day = '$currentDay'
AND FROM_UNIXTIME(arrivalTimeSec) BETWEEN FROM_UNIXTIME($CurrentTimeMinus30min) AND FROM_UNIXTIME($CurrentTimePlus4Hours) " );
EDIT - I hadn't noticed that arrivalTimeSec was also a timestamp. The above mightn't be a workable answer for you, but try it. If it doesn't work, as others say, define what you mean by
This doesn't seem to be working at all.
Is it not returning any rows? Is it returning an error? Can you print out $CurrentTimeMinus30min and $CurrentTimePlus4Hours? Narrow down the potential areas for problems.
Have you tried to encapsulate the between? This could potentially solve your problem:
SELECT * FROM flightSched
WHERE day = '$currentDay'
AND (arrivalTimeSec BETWEEN '$CurrentTimeMinus30min' AND '$CurrentTimePlus4Hours')
Also why not just do:
$CurrentTimeMinus30min = strtotime('-30 minutes');
Or
$CurrentTimeMinus30min = strtotime(date('Y-m-d H:i:00', strtotime('-30 minutes')));
Please send us some examples of what your variables are generating.
Your time calculation with date("H:i",...) and strtotime(..) seems to actually produce the correct results, although there is a much easier way to add/substract n minutes from the current time:
$now = time();
$currentTimeMinus30min = $now - 30*60; // 30 minutes * 60 seconds
$currentTimePlus4Hours = $now + 4*60*60; // 4 hours * 60 minutes * 60 seconds
(I assume your time entries in your database are unix timestamps.)
Your query looks fine, too, but there are a few things to keep in mind:
You have redundant fields in your database (day and time can be calculated from the timestamp)
Working with time variables can easily lead to confusion, as the time passes on and if you have no entries in your database that match the specified time range (-30m to +240m) the result set is empty. So to test the query update the database with current time stamps.
I would suggest the following:
Drop the redundant columns day and time and just use the timestamp as base for your calculations, because the day and time is already included in the timestamp. So just use a simple query like
select * from flightShed
where arrivalTime between $begin and $end

need to convert data and time values to microtime

have a database with data and time
example: 2013-06-04 08:20:00
need to convert that to
example: 1378478351000
so i can add that number to jquery script event calendar
when i use this php code
$exc_date = $row_Recordset1['exc_date'];
$exc_date = microtime(true) *1000 ;
echo $exc_date;
it works right but it shows me the current date and time not the date and time saved at database,
can somone please help , thanks
If you want to avoid the calculations in PHP, add a computed column using unix_timestamp and str_to_date to your query:
select (
unix_timestamp(str_to_date(TimeStrColumnName, '%Y-%m-%d %H:%i:%s')) * 1000)
as utime,
# ... the rest of your query as before
if the MySQL column is already a date/time field (instead of a string), this will do it:
select (unix_timestamp(TimeStampColumnName) * 1000) as utime,
# ... the rest of your query as before
Of course it does, as you overwrite the database values in the second line by putting microtime instead in it.
You will not be able to get the microtime, when you just have the format of date in the database - so you should use 0. microtime is returning the value of the actual microtime at the moment.
You should do something like that to get time + microtime:
$exec_date = strtotime($row_Recordset1[exec_date"]) . "000";
More information here. The problem with this is, that you will get it as a string, so you will need to convert it to an integer:
$exec_date = (int) $exec_date;
Hope it helps you.

How to extract only Hour data from PHP Time string?

I have a collection of time records in a database in the format '09:51:06' (hour, minute, second).
I have a query which retrieves a bunch of these times from the database, but I only care for the Hour reference.
How can I get rid of the rest of the string and ad just the hour into an array? So in the example above, I just want to keep '09'.
I've looked into exploding and substrings, but can't seem to figure it out.
Thanks.
Exploding the string would look like this (you probably want to add intval() to be able to use it as a real number):
$hours = array_shift(explode(':', '09:51:06'));
But you are probably looking for the right query instead of doing this afterwards. If you are dealing with a time-type, you can use MySQL's date and time functions (HOUR() in this case):
SELECT HOUR(`time_column`) AS `hour` FROM `your_table`
Or from the database itself
SELECT TIME_FORMAT(field_name, '%H') as return_hour from table_name
$time_string='09:51:06';
$your_array[$array_index]=substr($time_string, 0, 2);
for more info on substr
I guess you can do this either thru string manipulation or time/date. Any worthwhile date way would be on the SQL side, PHP has mktime and date functions but you would have get the hour you're looking for intermediately along the way if you were to construct a date anyway
String
$thisHour = array_shift(explode(':', $timeString)); //this gets hour
$thisHour - substr($timeString, 0, 2); // or this
$hours[] = $thisHour; //this adds to array

Categories