add 3 milliseconds to timestamp
Moderators: chulett, rschirm, roy
add 3 milliseconds to timestamp
Hi guys,
I wanted advice on adding 3 milli secs. to a timestamp of length 23 and scale 3.
I can do this with a basic routine which substrings the different literals in a timestamp (year, month, day, hour, min, secs and milli secs.)
But is that the best way to go about doing it. This query is more like confirming the way i am heading and if you can give me any more suggestions.
in.tp = 09/21/2005 12:31:39.656
out.tp = 09/21/2005 12:31:39.659
Why i am thinking of writing a routine is because, the tp can also be
12/31/2005 23:59:59.997
Am i heading in the right direction
I wanted advice on adding 3 milli secs. to a timestamp of length 23 and scale 3.
I can do this with a basic routine which substrings the different literals in a timestamp (year, month, day, hour, min, secs and milli secs.)
But is that the best way to go about doing it. This query is more like confirming the way i am heading and if you can give me any more suggestions.
in.tp = 09/21/2005 12:31:39.656
out.tp = 09/21/2005 12:31:39.659
Why i am thinking of writing a routine is because, the tp can also be
12/31/2005 23:59:59.997
Am i heading in the right direction
Creativity is allowing yourself to make mistakes. Art is knowing which ones to keep.
Yes you are. DS doesn't have a date+time manipulation facility, so writing your own function is great. Checkout this for a headstart:
viewtopic.php?t=85788
viewtopic.php?t=85788
Kenneth Bland
Rank: Sempai
Belt: First degree black
Fight name: Captain Hook
Signature knockout: right upper cut followed by left hook
Signature submission: Crucifix combined with leg triangle
Rank: Sempai
Belt: First degree black
Fight name: Captain Hook
Signature knockout: right upper cut followed by left hook
Signature submission: Crucifix combined with leg triangle
Most Definately.
But dont you guys laugh at my data structures.
enjoy.
But dont you guys laugh at my data structures.
Code: Select all
*** CURRENTLY THE ROUTINE ONLY HANDLES TIMESTAMP OF FORMAT YYYY/MM/DD HH:MM:SS.sss
x = trim(Arg1)
***INITIALIZE VARIABLES
Hr = 0
Mn = 0
Sc = 0
Ms = 0
Date = ''
NewSc = ''
NewMn = ''
NewHr = ''
InDate = ''
NewDate = ''
MsChk = 0
ScChk = 0
MnChk = 0
HrChk = 0
***SUBSTRING DIFFERENT LITERALS IN TIME
Hr = x[12,2]
Mn = x[15,2]
Sc = x[18,2]
Ms = x[21,3]
***CHANGE THE ICONV TO HANDLE OTHER DATE FORMATS
Date = x[1,10]
InDate = Iconv(Date,"D/YMD[4,2,2]")
***CHECK FOR LIMITS
MsChk = 1000 - (Ms + 3)
ScChk = 60 - (Sc + 1)
MnChk = 60 - (Mn + 1)
HrChk = 24 - (Hr + 1)
IF (MsChk <= 0)
THEN
GOTO AddCascade:
END
Else
GOTO SimpleAdd:
END
**THIS FUNCTION IS CALLED IF ADDITION OF 3 MILLI SECONDS
**DOES NOT TOUCH OR 999
SimpleAdd:
Ans = Date:' ':Hr:':':Mn:':':Sc:'.':(Ms + 3)
RETURN(Ans)
**THIS FUNCTION IS CALLED IF ADDITION OF 3 MILLI SECONDS
**EXCEEDS 999.
AddCascade:
IF (ScChk = 0)
THEN
NewSc = '00'
IF (MnChk = 0)
THEN
NewMn = '00'
IF (HrChk = 0)
THEN
NewHr = '00'
NewDate = InDate + 1
END
ELSE
NewHr = Hr + 1
NewDate = InDate
END
END
ELSE
NewMn = Mn + 1
NewHr = Hr
NewDate = InDate
END
END
ELSE
NewSc = Sc + 1
NewMn = Mn
NewHr = Hr
NewDate = InDate
END
Ans = OCONV(NewDate,"D/YMD[4,2,2]"):' ':NewHr:':':NewMn:':':NewSc:'.':'00':Abs(MsChk)
RETURN(Ans)
Creativity is allowing yourself to make mistakes. Art is knowing which ones to keep.
-
- Participant
- Posts: 54607
- Joined: Wed Oct 23, 2002 10:52 pm
- Location: Sydney, Australia
- Contact:
Ray,
I did not exaclty get your case.
Do you mean the date in that format or the case yyyy/12/31 23:59:59.998 and add .003 secs to it ???
If that latter then that has already been tested and the routine can handle that???
Can you please elaborate???
I did not exaclty get your case.
Do you mean the date in that format or the case yyyy/12/31 23:59:59.998 and add .003 secs to it ???
If that latter then that has already been tested and the routine can handle that???
Can you please elaborate???
Creativity is allowing yourself to make mistakes. Art is knowing which ones to keep.
-
- Participant
- Posts: 54607
- Joined: Wed Oct 23, 2002 10:52 pm
- Location: Sydney, Australia
- Contact:
What I meant was that you should include this case in your test data.
Does your routine work properly if the increment is negative? (Does it need to?) Try always to create re-usable components; in this case that suggests a second argument (milliseconds) for your function.
Meaningfully named arguments are always to be recommended, as they aid future developers. You can add description for each argument on the Arguments tab.
Does your routine work properly if the increment is negative? (Does it need to?) Try always to create re-usable components; in this case that suggests a second argument (milliseconds) for your function.
Meaningfully named arguments are always to be recommended, as they aid future developers. You can add description for each argument on the Arguments tab.
IBM Software Services Group
Any contribution to this forum is my own opinion and does not necessarily reflect any position that IBM may hold.
Any contribution to this forum is my own opinion and does not necessarily reflect any position that IBM may hold.
Well Ray, all the test scenarios accomodating to our requirements have been satisfied. No, currently the routine just handles adding three millisecs. to the timestamp which is hardcoded in the routine.
I will definately enhance it to take in a second argument which is the milli secs to be added. I can even echance it to accept a third argument that identifies what argument 2 needs to be added in, mins, secs, hrs. etc
I can certainly make it more flexible.
Thanks Ray for your comments.
Regards,
I will definately enhance it to take in a second argument which is the milli secs to be added. I can even echance it to accept a third argument that identifies what argument 2 needs to be added in, mins, secs, hrs. etc
I can certainly make it more flexible.
Thanks Ray for your comments.
Regards,
Creativity is allowing yourself to make mistakes. Art is knowing which ones to keep.
I finally got the time to enhance my routine. Now it can handle much more than just adding 3 milliseconds to the timestamp.
The revised routine handles timestamp manipulation
Routine(Arg1,Arg2,Arg3)
Arg1 = Timestamp in the format (YYYY/MM/DD HH:MM:SS.sss) eg: 2004/12/31 23:59:59.999
Arg2 = Number to be added
Arg3 = The type of manipulation needed.
Available options for Arg3:
MSEC or msec : For millisecond manipulation
SS or ss : For second manipulation
MM or mm : For minutes manipulation
DD or dd : For days manipulation
Can handle negative numbers as Arg2 too.
Just wanted to share it with you guys. Any more suggestions would be greatly appreciated.
The revised routine handles timestamp manipulation
Routine(Arg1,Arg2,Arg3)
Arg1 = Timestamp in the format (YYYY/MM/DD HH:MM:SS.sss) eg: 2004/12/31 23:59:59.999
Arg2 = Number to be added
Arg3 = The type of manipulation needed.
Available options for Arg3:
MSEC or msec : For millisecond manipulation
SS or ss : For second manipulation
MM or mm : For minutes manipulation
DD or dd : For days manipulation
Can handle negative numbers as Arg2 too.
Code: Select all
*** CURRENTLY THE ROUTINE ONLY HANDLES TIMESTAMP OF FORMAT YYYY/MM/DD HH:MM:SS.sss
InTimeStamp = trim(Arg1)
NumToAdd = Abs(trim(Arg2))
Type = UPCASE(trim(Arg3))
*-----------------------------------------------------------
*INITIALIZE VARIABLES
*-----------------------------------------------------------
Date = ''
InDate = ''
NewDate = ''
Result = ''
Ans = ''
*-----------------------------------------------------------
*Substring different literals of timestamp.
*-----------------------------------------------------------
MilliSecPart = InTimeStamp[21,3]
Date = InTimeStamp[1,10]
Time = InTimeStamp[12,8]
InDate = ICONV(Date,"D/YMD[4,2,2]")
InTime = ICONV(Time,"MTS")
*-----------------------------------------------------------
*Determine type of manipulation
*-----------------------------------------------------------
Begin Case
Case Type='MSEC'
GOTO AddMilliSec:
Case Type='SS'
ChgNum = NumToAdd
GOTO TimeCalc:
Case Type='MM'
ChgNum = NumToAdd*60
GOTO TimeCalc:
Case Type='HH'
ChgNum = NumToAdd*60*60
GOTO TimeCalc:
Case Type='DD'
GOTO AddDay:
Case 1
Ans = "Error: Not a valid option for Arg3"
Return(Ans)
End Case
*-----------------------------------------------------------
* This Function Manipulates MilliSeconds.
*-----------------------------------------------------------
AddMilliSec:
MillisecChk = Field((MilliSecPart + NumToAdd)/1000,".",1)
AddCasMillSec = Field((MilliSecPart + NumToAdd)/1000,".",2)
FmtMillSec = FMT(AddCasMillSec,"3'0'L")
*-----------------------------------------------------------
* Add Cascasde of Milliseconds
*-----------------------------------------------------------
IF (MillisecChk <> 0)
THEN
NewTime = InTime + MillisecChk
If (NewTime < 86399)
Then
NewDate = InDate
End
Else
NewDate = InDate + 1
End
Ans = OCONV(NewDate,"D/YMD[4,2,2]"):' ':OCONV(NewTime,"MTS"):".":FmtMillSec
RETURN(Ans)
END
*-----------------------------------------------------------
* Simple Add of MilliSeconds
*-----------------------------------------------------------
Else
NewDate = InDate
NewTime = InTime
Ans = OCONV(NewDate,"D/YMD[4,2,2]"):' ':OCONV(NewTime,"MTS"):".":FmtMillSec
Return(Ans)
END
*-----------------------------------------------------------
* This Function Manipulates Hours, Minutes and Seconds
*-----------------------------------------------------------
TimeCalc:
NewTime = InTime + ChgNum
If (NewTime < 86399)
Then
NewDate = InDate
End
Else
NewDate = InDate + 1
End
Ans = OCONV(NewDate,"D/YMD[4,2,2]"):' ':OCONV(NewTime,"MTS"):".":MilliSecPart
Return(Ans)
*-----------------------------------------------------------
* This Function Adds Days.
*-----------------------------------------------------------
AddDay:
NewDate = InDate + NumToAdd
Ans = OCONV(NewDate,"D/YMD[4,2,2]"):' ':OCONV(InTime,"MTS"):".":MilliSecPart
Return(Ans)
Creativity is allowing yourself to make mistakes. Art is knowing which ones to keep.
Hello All,
I'm battling to add years together.
Is there anyway I can expand on this to add years.?
I currently have a problem like this.
maturity_date = commencement_date + term_years
I suppose what I'm really looking for is this function above to add years as well, but the numbers won't be right because of leap years, etc.
Please help.
I'm battling to add years together.
Is there anyway I can expand on this to add years.?
I currently have a problem like this.
maturity_date = commencement_date + term_years
I suppose what I'm really looking for is this function above to add years as well, but the numbers won't be right because of leap years, etc.
Please help.
~The simpliest solutions are always the best~
~Trick is to understand the complexity to implement simplicity~
~Trick is to understand the complexity to implement simplicity~