BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
BETO
Fluorite | Level 6

Hi I have a data step where I used a IF and Statement. When it runs it doesn't use the starttime and end time provided

STARTtime       EndTime                                  Day_Diff

05:32:00AM      10:45:00 AM                                  0

01/26/12             01/26/12

DATA TEST;

SET TEST;

IF  StartTime >= '20:00:00PM'T  /*Ticket open after 8PM anyday*/

   AND ENDTime <= '12:00:00PM'T  /*Ticket open after 8PM anyday*/

   AND DAY_DIFF < 1

                THEN PAY="YES";

RUN;

I don't know what I'm doing wrong. I've it formatted  TimeAMPM.

Thanks for any as.. FYI I'm looking for in Day_Diff 0 and 1

1 ACCEPTED SOLUTION

Accepted Solutions
Peter_C
Rhodochrosite | Level 12

Patrick

I expect I am in agreement with you, but start with different objectives:

"Midnight" is specific and the only trouble is deciding to which "date" it belongs. Clearly for SAS, in a datetime value, midnight belongs to the following day (0 seconds into the day). The datetime value 86399 is still in 01Jan1960 and one second later  datepart(86400) returns the next day.

This is consistent with other SAS interval values which start having the sub-interval= 0 which is another way of saying datetime is "at the start of the interval".

I can live with this interpretation that SAS provides - midnight is at the beginning of a day and has time value 0 or 00:00:00. It is the addition of AM or PM to the 12th hour that I find really unhelpful --> it requires more text than the military time and doesn't clarify (for me). For clarity, I would never recommend using AM and PM with time constants. I haven't found anyone unclear about 24hour clock time.

Perhaps I should enter the modern world of 12PM as it seems I'm very much in a 'midday' minority.

...

and also pay more attention to the OP questions.

Peter

View solution in original post

10 REPLIES 10
Patrick
Opal | Level 21

If you're using AM and PM what is the meaning of '20:00:00PM'T ?

Shouldn't this be '08:00:00PM'T ?

BETO
Fluorite | Level 6

Patrick,

I've been using diffrent formats ..I must copy my last attempt ( Reason for the other format). I did try your recomendation ...same output.. It Seems like Starttime and Endtime isn't read correctly

DATA TEST;

SET TEST;

IF  StartTime >= '08:00:00PM'T  /*Ticket open after 8PM anyday*/

   AND ENDTime <= '12:00:00PM'T  /*Ticket open after 8PM anyday*/

   AND DAY_DIFF < 1

                THEN PAY="YES";

RUN;

Patrick
Opal | Level 21

I believe the other issue you're having is that '12:00:00PM'T is interpreted as noon and not midnight.

I suggest to use a 24 hours day and function HMS() to avoid any further problems.

DATA _null_;
  StartTime='08:00:00PM'T;
  put StartTime=;
  ENDTime = '12:00:00PM'T;
  put ENDTime=;
  ENDTime = '12:00:00AM'T;
  put ENDTime=;

  /* use hms() */
  StartTime=hms(20,0,0);
  put StartTime=;
  Endtime=hms(24,0,0);
  put EndTime=;
RUN;

FriedEgg
SAS Employee

Are starttime and endtime stored as only time data or as datetime?

The data you present makes me beleive datetime:

BETO wrote:

STARTtime       EndTime                                  Day_Diff

05:32:00AM      10:45:00 AM                                  0

01/26/12             01/26/12

If so try:

DATA TEST;

SET TEST;

IF  timepart(StartTime) >= '08:00:00PM'T  /*Ticket open after 8PM anyday*/

   AND timepart(ENDTime) <= '12:00:00PM'T  /*Ticket open after 8PM anyday*/

   AND DAY_DIFF < 1

                THEN PAY="YES";

RUN;


Peter_C
Rhodochrosite | Level 12

FriedEg has provided the solution.

I would add that if you are happy with times like 20:00:00 then use that style and drop the AM / PM. SAS can work out that 21:23:59PM is the same as 21:23:59.

That removes the question of what is intended by 12:00:00PM 

Sadly SAS doesn't support the classic solution NOON or MIDNIGHT in time constants not the TIME nor TIMEAMPM formats, but we can construct them with code like

proc format ;

invalue mytime (upcase default=32)

    'NOON'     = '12:0't

    'MIDNIGHT' = '00:0't

   other      = [time.]

    ;

   value mytime (default=8 )

    '12:0't  = 'NOON' 

    '00:0't  = 'MIDNIGHT'

      other  = [time8.]

    ;

run ;

data DEMO_times ;

noon = '12:0:0't ;

do time = noon-2 to noon+                  /* test NOON and AM/PM        */

       ,  noon + '0:59:58't to noon+'1:0:2't /* demo 13:00PM is 1:00PM */

       , -2 to 2                                        /* test MIDNIGHT              */

       , '0:59:58't to '1:0:2't              /* test 12:00 AM to 1:00 AM   */

      ;

   tim = timepart( time) ;                   /* avoid negative time        */

   xxx = lowcase( put( tim, mytime. )) ;     /* read lowcase time string ok*/

   chk = input( xxx, mytime. ) ;

   put tim= mytime. chk= timeAMPM. chk= mytime. ;

end ;

run ;

Patrick
Opal | Level 21

@Peter

The question is always: Is midnight the end of a day or the beginning of a new day? Is the time value for midnight '0' or '86400'?

As much as I can see SAS time informats treat midnight as beginning of a new day (= 0)

The way the OP formulated the selection midnight needs to be "end of the day" (=86400)

HMS(24,0,0) will resolve into 86400.

The code you've posted still uses a value of '0' for midnight.

Peter_C
Rhodochrosite | Level 12

Patrick

I expect I am in agreement with you, but start with different objectives:

"Midnight" is specific and the only trouble is deciding to which "date" it belongs. Clearly for SAS, in a datetime value, midnight belongs to the following day (0 seconds into the day). The datetime value 86399 is still in 01Jan1960 and one second later  datepart(86400) returns the next day.

This is consistent with other SAS interval values which start having the sub-interval= 0 which is another way of saying datetime is "at the start of the interval".

I can live with this interpretation that SAS provides - midnight is at the beginning of a day and has time value 0 or 00:00:00. It is the addition of AM or PM to the 12th hour that I find really unhelpful --> it requires more text than the military time and doesn't clarify (for me). For clarity, I would never recommend using AM and PM with time constants. I haven't found anyone unclear about 24hour clock time.

Perhaps I should enter the modern world of 12PM as it seems I'm very much in a 'midday' minority.

...

and also pay more attention to the OP questions.

Peter

BETO
Fluorite | Level 6

First I want to thank you guys for assisting me ... I normally reach out when I hit a wall .

startdate

starttime

date

ENDdate

ENDtime

1/5/2012

12:03:00 AM

1/5/2012

1/5/2012

10:12:00 AM

Enclose is  a snapshot of the output I don't know if its me not getting it but I tried the example code you all three provided and it work 90% of the time. On the snapshot enclose it should have been a pass. The script  looks at Starttime if it falls between 8AM-8PM and its with 4hr or less duration then its a pass that part  working fine . The second part is when  starttime is  after 8PM  and endtime 12PM next day that is consider a pass. The EndTime can be between 8PM thru 12PM next day Thats where I've been having my issue  with the If and Statement, time  since it crosses over to a new day I tried duration time of less than or EQ 12.0 but it looks at the whole  day ... Thanks again 

art297
Opal | Level 21

In your example the end datetime is before the start datetime.  Was that a typo?

If it was, as suggested by others, if you have dates and times create a datetime variable.  That way you could change your criteria to only look for x number of seconds and not have to build extra logic to account for crossing day boundaries.

BETO
Fluorite | Level 6

Thank You Guys for assiting me ... It took awhile but I was able to get what I needed based on your inputs...

sas-innovate-2024.png

Today is the last day to save with the early bird rate! Register today for just $695 - $100 off the standard rate.

 

Plus, pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 10 replies
  • 1610 views
  • 6 likes
  • 5 in conversation