Page 1 of 1
DateGenericIsDate is NOT working
Posted: Fri Jan 04, 2013 9:25 am
by harshkohli
One of our old DataStage job started abending from January 1, 2013 with the following error :
WSWDS044CommonInvoice..S50TransValidate (DateGenericToTimeStamp): Could not convert date/time :20130102
This job uses the 'DateGenericIsDate' function and has the following code in the stage variables :
If RecordIdValid = 'Y' and FromS10WSWT017.SPO_INVC_DATE_FLG ='Y' And FromS05ds04401_at.SPO_INVC_DATE <> space(10)
And DateGenericIsDate(FromS05ds04401_at.SPO_INVC_DATE) = 1 and Substrings(FromS05ds04401_at.SPO_INVC_DATE,1,4) > 1980
and Substrings(FromS05ds04401_at.SPO_INVC_DATE,1,4) < 2025 Then 'Y' Else 'N'
The job worked without any issues till December 31st, 2012. The date format which is being validated is CCYYMMDD. It worked with date 20121231 but did not work with date 20130102. Can someone help in identifying the issue. I noticed that the code uses the function 'DateGenericIsDate' but in the error message, it is displaying 'DateGenericToTimeStamp'. Any help is fixing the issue is appriciated?
Thanks
Posted: Fri Jan 04, 2013 10:23 am
by chulett
That sounds like a custom routine - can you locate it in the repository through the Manager? Then a double-click on it will show the source code.
Posted: Fri Jan 04, 2013 10:52 am
by harshkohli
DateGenericIsDate is under Transform -> sdk -> date -> Generic in manager/Designer. When I double click DateGenericIsDate, it does not give any code but under 'Details' tab under 'definition' it has the following :
(If DateGenericToTimeStamp(%InputDate%, 0) # "" Then 1 Else 0)
It seems it is using 'DateGenericToTimeStamp' function.
Posted: Fri Jan 04, 2013 11:13 am
by chulett
Ah... so one of the SDK transforms. Can you now locate the second function / transform?
Posted: Fri Jan 04, 2013 11:22 am
by harshkohli
'DateGenericToTimeStamp' is located under Routines -> sdk -> date and has the following code :
Code: Select all
*************************************************************************
* Copyright (C) 2004, 1997-2003 Ascential Software Corporation. All Rights Reserved. *
* This code may be copied on condition that this copyright *
* notice is included as is in any code derived from this source. *
*************************************************************************
*
* Routine takes many date formats and converts them to a common output format;
* the SDK timestamp format "YYYYMMDD HH:MM:SS.SSS".
*
* Expected input formats:
* If Arg2 = 1 then format of Date is expected to be (CC)YY MM DD with delimiters.
* If Arg2 = 0 then format of the date is expected as stated below.
* - Any delimited date with Month Day Year, e.g. 4/19/1999, 4.19.1999, 4/19/99, 4.19.99
* - Alpha month dates ie. Apr 19 1999, Apr 19 99
* - Non-delimited date with Year Month day e.g. 19990419, 990419
* - Jullian Year Days ie. 99126, 1999126
* These could also have a time entry, e.g. 10:30:49.000, 10:30:49 or 10:30
RoutineName = 'DateGenericToTimeStamp'
Deffun DSRMessage(A1, A2, A3) Calling "*DataStage*DSR_MESSAGE"
*
* Following variables are for Y2K automation:
* Y2KDate is the year to 99 that will use the Y2KCentury
* If year coming in is less then Y2KDate then use Y2KCentury + 1
Y2KDate = 30
Y2KCentury = 19
* Remove extra spaces, and count number of spaces remaining
PDate = Trim(Arg1)
NumbofSpace = Count(PDate," ")
Begin Case
Case NumbofSpace = 1
IDate = Field(PDate," ",1)
ITime = Field(PDate," ",2)
Case NumbofSpace = 3
Pos = Index(PDate," ",3)
IDate = PDate[1,Pos-1]
ITime = Field(PDate," ",4)
Case 1
If Index(PDate,":",1) Then
IDate = Oconv(@date,"D")
ITime = PDate
End Else
IDate = PDate
ITime = "00:00:00.000"
End
End Case
Begin Case
Case Len(ITime) = 5
ITime = ITime:":00.000"
Case Len(ITime)=8
ITime = ITime:".000"
Case Len(ITime)=11
ITime = ITime:"0"
End Case
If not(isnull(Arg1)) then
If Arg2 then
IDate = Iconv(IDate,"DYMD[2,2,2]")
End Else
IDate = Iconv(IDate,"D")
End
If Status() or Field(ITime,":",1) > 23 or Field(ITime,":",2) > 59 or Field(ITime,":",3) > 59.999 Then
Message = DSRMessage("DSTAGE_TRX_E_0015", "Could not convert date/time :%1", Arg1)
CALL DSLogWarn(Message, RoutineName)
Ans = ""
End Else
Year = Oconv(IDate,"DY")
If Index(Arg1,Year,1) else
Year = Oconv(IDate,"D2Y")
Month = Oconv(IDate,"DM")
Day = Oconv(IDate,"DD")
If Year GE Y2KDate then
Year = Y2KCentury:Year
End Else
Year = Y2KCentury+1:Year
End
IDate = Iconv(Year:"-":Month:"-":Day,"D-YMD[4,2,2]")
End
Ans = Trim(Oconv(IDate,"DYMD[4'',2'',2'']")," ","A"):" ":ITime
End
End Else
Ans = Arg1
End
Posted: Sat Jan 05, 2013 9:00 am
by chulett
Any luck with this? I have absolutely no ability to test stuff like this any more and a quick eyeball of the code doesn't reveal anything to me that looks like it would care about the fact that you've rolled over into 2013.
Any chance that there's more to the data than just "20130102", like extra spaces or unprintable characters?
![Confused :?](./images/smilies/icon_confused.gif)
Posted: Sat Jan 05, 2013 10:43 am
by ArndW
It would seem that
will correctly convert, while
won't.
Posted: Sat Jan 05, 2013 11:03 am
by chulett
So, it would seem by observation or by testing? I wonder if we've passed some "far future" threshold for the original coding of that function... if that's the case (that the simple test Arnd posted fails) then it seems like something to get in front of your official support provider.
Posted: Sat Jan 05, 2013 11:24 am
by ArndW
I tested it, and it fails. I don't have any docs to check whether this is expected behaviour or not, but I don't believe it is.
Posted: Sat Jan 05, 2013 11:46 am
by chulett
Yah, I don't believe so either.
Posted: Mon Jan 07, 2013 7:54 am
by harshkohli
While testing, I set the time/date locale for this job to OFF and then recomplied the program and now the job does not give any errors. Earlier the time/date locale under NLS was set to 'US-English' :
Edit -> Job Properties -> NLS Tab -> Default Locale Categories -> turn Time/Date to OFF
I still have to validate the output file but atleast the job is not giving errors with Jan 2013 dates.
The description of the function 'DateGenericIsDate' also says the following :
In an NLS environment, this transform will not work for most formats, unless the time/date locale for the job is set to OFF.
Posted: Mon Jan 07, 2013 8:15 am
by chulett
Good find! Let us know...
Posted: Mon Jan 07, 2013 3:44 pm
by ray.wurlod
So, 2013 does not exist for US-English locale. Did the fiscal cliff thing actually happen?
Posted: Tue Jan 08, 2013 7:35 am
by chulett
Well, apparently the temporal cliff did.
![Confused :?](./images/smilies/icon_confused.gif)