Jump to content

Problem in computation of late hours(disregard the seconds)


newphpcoder

Recommended Posts

Hi..

 

I got problem in getting the time difference between two datetimes.

 

My problem is how can I only get the difference of hours and minutes disregard the seconds from datetime..

 

here is my sample login and logout:

 

 

Login : 2012-03-12 05:39:17

Logout: 2012-03-12 13:35:16

 

And here is my code in getting the Rendered or total hours:

 

UPDATE reg_att SET Rendered = case 
when time_to_sec(time(LOGIN)) BETWEEN time_to_sec('05:35:00') AND time_to_sec('06:59:00') AND time_to_sec(time(LOGOUT)) BETWEEN time_to_sec('13:35:00') AND time_to_sec('15:35:00')
AND DATE_FORMAT(LOGIN, '%W') IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')
then sec_to_time(time_to_sec(concat(substr(LOGIN, 1,10), ' ' , '08:00:00')) -
(time_to_sec(LOGIN) - time_to_sec(concat(substr(LOGIN, 1,10), ' ' , '05:35:59'))))
End;

 

the output of this is :

Rendered = 07:56:42

 

and I need to compute the lates:

 

I used this code for lates:

 

UPDATE reg_att SET Late = case 
when time_to_sec(time(LOGIN)) BETWEEN time_to_sec('05:35:00') AND time_to_sec('06:59:00') AND time_to_sec(time(LOGOUT)) BETWEEN time_to_sec('13:35:00') AND time_to_sec('15:35:00')
AND DATE_FORMAT(LOGIN, '%W') IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')
then sec_to_time(time_to_sec('08:00:00') - time_to_sec(Rendered))
END;

 

the output of this is:

 

Late = 00:03:18

 

 

Now, How can be the late become : 00:04:00

 

Disregard the seconds?

 

 

his schedule is 05:35 - 13:35

 

he login 05:39, so he was late 4 minutes, but in my code it computes  00:03:18 because it regards the seconds.

 

Any help is highly appreciated.

 

Thank you so much..

 

Link to comment
Share on other sites

a bit ugly solution

 

inspired from http://stackoverflow.com/questions/5764560/how-do-i-round-a-mysql-time-to-the-nearest-hour-not-a-date-time-timestamp

 

Step by step

  • calculate the difference in seconds unit
  • divide it with 60 (so we have the difference in minutes unit)
  • FLOOR it (take it to nearest integer)
  • add with 1
  • multiply by 60 (to return it in seconds unit)
     

 

so the query will be:

SEC_TO_TIME( (
FLOOR( (
TIME_TO_SEC(  '08:00:00' ) - TIME_TO_SEC(Rendered) )  / 60 ) + 1
) *60
)

Link to comment
Share on other sites

a bit ugly solution

 

inspired from http://stackoverflow.com/questions/5764560/how-do-i-round-a-mysql-time-to-the-nearest-hour-not-a-date-time-timestamp

 

Step by step

  • calculate the difference in seconds unit
  • divide it with 60 (so we have the difference in minutes unit)
  • FLOOR it (take it to nearest integer)
  • add with 1
  • multiply by 60 (to return it in seconds unit)
     

 

so the query will be:

SEC_TO_TIME( (
FLOOR( (
TIME_TO_SEC(  '08:00:00' ) - TIME_TO_SEC(Rendered) )  / 60 ) + 1
) *60
)

 

I tried it:

 

when time_to_sec(time(LOGIN)) BETWEEN time_to_sec('05:35:00') AND time_to_sec('06:59:00') AND time_to_sec(time(LOGOUT)) BETWEEN time_to_sec('09:35:00') AND time_to_sec('09:59:00')
AND DATE_FORMAT(LOGIN, '%W') IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')
then SEC_TO_TIME( (FLOOR( (TIME_TO_SEC(  '08:00:00' ) - TIME_TO_SEC(Rendered) )  / 60 ) + 1) *60)

 

with this data:

 

login in 2012-03-01 05:37:18

 

logout 2012-03-01 13:36:35

 

the rendered is : 07:58:41

 

late: 00:01:19

 

 

Link to comment
Share on other sites

 

I tried it:

 

when time_to_sec(time(LOGIN)) BETWEEN time_to_sec('05:35:00') AND time_to_sec('06:59:00') AND time_to_sec(time(LOGOUT)) BETWEEN time_to_sec('09:35:00') AND time_to_sec('09:59:00')
AND DATE_FORMAT(LOGIN, '%W') IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')
then SEC_TO_TIME( (FLOOR( (TIME_TO_SEC(  '08:00:00' ) - TIME_TO_SEC(Rendered) )  / 60 ) + 1) *60)

 

with this data:

 

login in 2012-03-01 05:37:18

 

logout 2012-03-01 13:36:35

 

the rendered is : 07:58:41

 

late: 00:01:19

hmmm, its strange

 

As far as i know your trouble lies in this code

sec_to_time(time_to_sec('08:00:00') - time_to_sec(Rendered))

 

so i suggest you to only change that line

when I try it myself

SELECT SEC_TO_TIME( (
FLOOR( (
TIME_TO_SEC(  '08:00:00' ) - TIME_TO_SEC(  '07:58:41' ) ) /60 ) +1
) *60
)

 

the result:

00:02:00

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.