[Mono-list] Problem with datetime format and oracle...
Daniel Morgan
danielmorgan@verizon.net
Sat, 19 Feb 2005 20:49:19 -0500
The Oracle dictionary view NLS_SESSION_PARAMETERS is helpful too. I
know this available on Oracle 9i, but I don't know if it's available on
Oracle 8i. Oracle 8i docs are not available on OTN because its not
supported by Oracle anymore.
SELECT VALUE
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';
Daniel Morgan wrote:
> I told you a fib. Oracle's default date format is 'DD-MON-RR' which
> is "dd-MMM-yy" for System.DataTime. I know this works since I
> successfully inserted a row using an OracleParameter.
>
> Also, here is a list of books for Oracle 9i at Oracle Technology
> Network. You need to be registered to use OTN. If you are not
> registered (its free), I strongly suggest you do.
>
> List of Oracle 9i books on OTN:
> http://www.oracle.com/pls/db92/db92.docindex?remark=homepage
>
> Oracle 9i SQL Reference - Format Models
> http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements4a.htm#34512
>
>
>
> In .NET 1.1 Framework Help, Search for "format specifiers, date and
> time format strings" and choose Custom DateTime Format Strings.
> Or on the web at MSDN Library:
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcustomdatetimeformatstrings.asp
>
>
> Right now, I am working on converting the Oracle Date format string to
> Mono's System.DateTime format string and vice-versa. This code will
> end up in OracleDateTime as internal static functions. I will be
> using OCINlsGetInfo since it works for me. OCINlsGetInfo will be
> located in OracleConnection as an internal function. I will try to
> commit to svn a working version (not complete) tonight.
>
> Daniel Morgan wrote:
>
>> The default date format for Oracle is 'DD-MMM-YY'. Example: '13-FEB-02'
>>
>> The fix needs to be able to handle situations where the date format
>> could be changed via ALTER SESSION SET NLS_DATE_FORMAT, such as,
>>
>> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
>>
>> I have some ideas on how to solve it:
>> 1. OCINlsGetInfo can be used to get the date format. However, once I
>> got this, I would need to reformat the date from OracleDateTime or
>> DateTime to Oracle's date and vice-vesa.
>> 2. (I haven't tried this yet - create DllImport's for OCI functions
>> OCIDateTimeToText and OCIDateTimeFromText and calls these functions
>> with an explicit
>> date format string. Oracle's OCIDate can stay as an IntPtr and
>> use other OCI functions to deal with it. 3. There are even OCI
>> functions to put the OCIDate into a byte array or get the OCIDate
>> from a byte array. OCIDateTimeFromArray and OCIDateTimeToArray.
>> DllImport's are needed for these functions too.
>>
>> More info can be found in Oracle Call Interface Programmer's Guide.
>>
>> http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96584/oci18m36.htm#512147
>>
>> **
>>
>> Here is working code so far...
>>
>> private string GetSessionNlsDateFormat()
>> {
>> byte[] buffer = new Byte[64];
>> uint bufflen = (uint) buffer.Length;
>> ushort item = (ushort) OciNlsServiceType.DATEFORMAT;
>> IntPtr session = connection.Session;
>> int st = OciCalls.OCINlsGetInfo (session,
>> connection.ErrorHandle,
>> ref buffer, bufflen, item);
>> // Get length of returned string
>> int rsize = 0;
>> IntPtr env = connection.Environment;
>> OciCalls.OCICharSetToUnicode (env, null, buffer, out rsize);
>> // Get string
>> StringBuilder ret = new StringBuilder(rsize);
>> OciCalls.OCICharSetToUnicode (env, ret, buffer, out rsize);
>>
>> string nlsDateFormat = ret.ToString ();
>> return nlsDateFormat;
>> }
>>
>> internal static int OCINlsGetInfo (IntPtr hndl,
>> IntPtr errhp,
>> ref byte[] bufp,
>> uint buflen,
>> ushort item)
>> {
>> Trace.WriteLineIf(traceOci, "OCINlsGetInfo", "OCI");
>> return OciNativeCalls.OCINlsGetInfo (hndl, errhp, bufp,
>> buflen, item);
>> }
>>
>> [DllImport ("oci")]
>> internal static extern int OCINlsGetInfo (IntPtr hndl,
>> IntPtr errhp,
>> [In][Out] byte[] bufp,
>> uint buflen,
>> ushort item);
>>
>>
>>
>>
>> Hubert FONGARNAND wrote:
>>
>>> I use mono to deal with an oracle database...
>>> the date format of my oracle database is "DD/MM/YY"
>>> but mono always send date like "DD/MM/YYYY"
>>> my NLS_LANG parameter is : NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1"
>>>