Cast date to varchar

Hi all,
Any idea why the timestamp is lost after casting a date into a varchar (FYI : datatype is datetime in the rpd)
if I have a date like ;
date = 5/2/2011 9:18:26 AM
CAST (date as varcchar(100)) gives 5-2-2011
Is there anyway to avoid this lost of precision
Best regards
Adil

Hi adil,
To eliminate timestamp,which i faced long back was a horrifying task.So i used trunc function this way
You can do this way by going to physcial layer of RPD and go to the table the date column is coming from
1) go to properties of the table
2) go to general tab and change the table type to SQL
3) Write the SQL by selecting required columns from that table including this date column i.e.
select x,y,trunc(date_column) from table_name
This way the timestamp will be gone.
CAST (date as varcchar(100)) gives 5-2-2011 I suppose as your converting it to varchar,it is assuming it as a string and omitting precision but changing to default date format(dd-mon-yy).
UPDATED POST
Ok got you wrong,so you want the he precision while converting it to char so you need to use evaluate with char and give the format and precision the way you require.
hope helps you.
Cheers,
KK
Edited by: Kranthi.K on Jun 1, 2011 10:16 PM

Similar Messages

  • Saving result from sp_executesql into a variable and using dynamic column name - getting error "Error converting data type varchar to numeric"

    Im getting an error when running a procedure that includes this code.
    I need to select from a dynamic column name and save the result in a variable, but seem to be having trouble with the values being fed to sp_executesql
    DECLARE @retval AS DECIMAL(12,2)
    DECLARE @MonthVal VARCHAR(20), @SpreadKeyVal INT
    DECLARE @sqlcmd AS NVARCHAR(150)
    DECLARE @paramdef NVARCHAR(150)
    SET @MonthVal = 'Month' + CAST(@MonthNumber AS VARCHAR(2) );
    SET @SpreadKeyVal = @SpreadKey; --CAST(@SpreadKey AS VARCHAR(10) );
    SET @sqlcmd = N' SELECT @retvalout = @MonthVal FROM dbo.CourseSpread WHERE CourseSpreadId = @SpreadKeyVal';
    SET @paramdef = N'@MonthVal VARCHAR(20), @SpreadKeyVal INT, @retvalout DECIMAL(12,2) OUTPUT'
    --default
    SET @retval = 0.0;
    EXECUTE sys.sp_executesql @sqlcmd,@paramdef, @MonthVal = 'Month4',@SpreadKeyVal = 1, @retvalout = @retval OUTPUT;
    SELECT @retval
    DECLARE @return_value DECIMAL(12,2)
    EXEC @return_value = [dbo].[GetSpreadValueByMonthNumber]
    @SpreadKey = 1,
    @MonthNumber = 4
    SELECT 'Return Value' = @return_value
    Msg 8114, Level 16, State 5, Line 1
    Error converting data type varchar to numeric.

    Please follow basic Netiquette and post the DDL we need to answer this. Follow industry and ANSI/ISO standards in your data. You should follow ISO-11179 rules for naming data elements. You should follow ISO-8601 rules for displaying temporal data. We need
    to know the data types, keys and constraints on the table. Avoid dialect in favor of ANSI/ISO Standard SQL. And you need to read and download the PDF for: 
    https://www.simple-talk.com/books/sql-books/119-sql-code-smells/
    >> I need to select from a dynamic column name and save the result in a variable, but seem to be having trouble with the values being fed to sp_executesql <<
    This is so very, very wrong! A column is an attribute of an entity. The idea that you are so screwed up that you have no idea if you want
    the shoe size, the phone number or something else at run time of this entity. 
    In Software Engineering we have a principle called cohesion that says a model should do one and only one task, have one and only one entry point, and one and only one exit point. 
    Hey, on a scale from 1 to 10, what color is your favorite letter of the alphabet? Yes, your mindset is that level of sillyity and absurdity. 
    Do you know that SQL is a declarative language? This family of languages does not use local variables! 
    Now think about “month_val” and what it means. A month is a temporal unit of measurement, so this is as silly as saying “liter_val” in your code. Why did you use “sp_” on a procedure? It has special meaning in T-SQL.  
    Think about how silly this is: 
     SET @month_val = 'Month' + CAST(@month_nbr AS VARCHAR(2));
    We do not do display formatting in a query. This is a violation of at the tiered architecture principle. We have a presentation layer. But more than that, the INTERVAL temporal data type is a {year-month} and never just a month. This is fundamental. 
    We need to see the DDL so we can re-write this mess. Want to fix it or not?
    --CELKO-- Books in Celko Series for Morgan-Kaufmann Publishing: Analytics and OLAP in SQL / Data and Databases: Concepts in Practice Data / Measurements and Standards in SQL SQL for Smarties / SQL Programming Style / SQL Puzzles and Answers / Thinking
    in Sets / Trees and Hierarchies in SQL

  • Named query creates wrong cast: CAST (? AS VARCHAR(32672))

    Hello!
    I'am working with Toplink on DB2 - which works great, so far - but now I face the following problem:
    A named query produces the following sql-code:
    ... WHERE (SAMPLEFIELDNAME = CAST (? AS VARCHAR(32672) ))
    The problem ist the cast: the data-base-fieldtype is a VARCHAR(255) so get an SQL-Exception. I can't change the database-schema, because this is legacy-stuff. I tried a lot (columnDefinition and length in @Column-annotation seem to be ignored at all) - but nothing worked.
    Thank you!
    Siegfried

    Hi,
    The DB2 Platform hard coded the casting of Strings to VARCHAR(32672) in the oracle.toplink.platform.database.DB2Platform class' writeParameterMarker method. So if the type is set to a String class on the argument, it will always be cast to VARCHAR(32672). You will need to override the writeParameterMarker method on a custom platform (extending DB2Platform) in such a way that if a string is given, VARCHAR(255) is used instead. That is, assuming all your strings are of size 255.
    Best Regards,
    Chris

  • Argument data type varchar is invalid for argument 1 of formatmessage function

    So, I have a need to parameterize my templates so I can dynamically compile and execute them as needed. I have read on some blogs that it is possible to use FORMATMESSAGE  for user string formatting but I can't seem to get that working on my end and
    would appreciate help getting this running. 
    I continually run into the following error message
    Msg 8116, Level 16, State 1, Line 9
    Argument data type varchar is invalid for argument 1 of formatmessage function.
    when I try to execute either of  the queries below
    1) 
     SELECT FORMATMESSAGE ( CAST('%s' AS VARCHAR(10)), 'name' );
    2) 
    -- printf formatting  %[[flag][width][.precision]]typeDECLARE @Format CHAR(1)         = ''   -- '',+,-,0,#,' '      , @Width INT              = 6    -- display field size      , @Precision INT          = 3    -- characters to display      , @Type CHAR(1)           = 'X'  -- s, d, i, u, o, x, X      , @Binary VARBINARY(128)  = 0x1239       , @Int INT                = 11                      , @String NVARCHAR(128)   = N'test';  DECLARE @$QL NVARCHAR(256) = ( SELECT FORMATMESSAGE( N'SELECT FORMATMESSAGE(''%%s -->%%%s*.*%s<--'', @$QL, %i, %i, %s)'                      , s.Flag                       , f.Type                      , @Width                      , @Precision                       , CASE WHEN @Type = 's'                              THEN FORMATMESSAGE('''%s''', @String)                             WHEN @Type = 'd'                             THEN FORMATMESSAGE('%d', @Int)                             WHEN @Type = 'i'                             THEN FORMATMESSAGE('%i', @Int)                             WHEN @Type = 'u'                             THEN FORMATMESSAGE('%u', @Int)                             WHEN @Type = 'o'                             THEN FORMATMESSAGE('%o', @Int)                             WHEN @Type = 'x'                             THEN FORMATMESSAGE('%x', @Binary)                             WHEN @Type = 'X'                             THEN FORMATMESSAGE('%X', @Binary)                             END )   FROM (SELECT           ('') AS Flag         UNION ALL SELECT ('+')          UNION ALL SELECT ('-')          UNION ALL SELECT ('0')          UNION ALL SELECT ('#')          UNION ALL SELECT (' ') ) AS s         CROSS JOIN (SELECT           ('s') AS Type               UNION ALL SELECT ('d')               UNION ALL SELECT ('i')               UNION ALL SELECT ('u')               UNION ALL SELECT ('o')               UNION ALL SELECT (LOWER('x'))               UNION ALL SELECT (UPPER('X')) ) as f   WHERE CHARINDEX(@Format,s.Flag) > 0   AND ASCII(f.Type) = ASCII(@Type) );EXEC sp_executesql @$QL, N'@$QL NVARCHAR(256)', @$QL;
    [email protected]

    Hi Databyter,
    Based on my testing, the first query runs fine in a SQL Server 2012 while I got the same error in your post when trying to run it in a SQL Server 2008R2.
    After going through the BOL of the FORMATMESSAGE for both versions, something came into my sight.  The note below was removed in the 2012 BOL.
    FORMATMESSAGE works only with messages created using
    sp_addmessage.
    BOL:FORMATMESSAGE(2008)
    BOL:FORMATMESSAGE(2012)
    The messages created using sp_addmessage can be viewed by using the sys.messages. Thus in SQL Server 2008, you have to follow the example to use the function or you get the error in your post.
    SELECT * FROM sys.messages WHERE message_id = 20009 AND language_id = 1033;
    DECLARE @var1 VARCHAR(200);
    SELECT @var1 = FORMATMESSAGE(20009, 'First Variable', 'Second Variable');
    SELECT @var1;
    For some reason the limitation is removed in SQL Server 2012, that's why your first query runs fine.
    If you have any feedback on our support, you can click
    here.
    Eric Zhang
    TechNet Community Support

  • I need to pass a query in form of string to DBMS_XMLQUERY.GETXML package...the parameters to the query are date and varchar ..please help me..

    I need to pass a query in form of string to DBMS_XMLQUERY.GETXML package...the parameters to the query are date and varchar ..please help me build the string .Below is the query and the out put. ( the string is building fine except the parameters are with out quotes)
    here is the procedure
    create or replace
    procedure temp(
        P_MTR_ID VARCHAR2,
        P_FROM_DATE    IN DATE ,
        P_THROUGH_DATE IN DATE ) AS
        L_XML CLOB;
        l_query VARCHAR2(2000);
    BEGIN
    l_query:=  'SELECT
        a.s_datetime DATETIME,
        a.downdate Ending_date,
        a.downtime Ending_time,
        TO_CHAR(ROUND(a.downusage,3),''9999999.000'') kWh_Usage,
        TO_CHAR(ROUND(a.downcost,2),''$9,999,999.00'') kWh_cost,
        TO_CHAR(ROUND(B.DOWNUSAGE,3),''9999999.000'') KVARH
      FROM
        (SELECT s_datetime + .000011574 s_datetime,
          TO_CHAR(S_DATETIME ,''mm/dd/yyyy'') DOWNDATE,
          DECODE(TO_CHAR(s_datetime+.000011574 ,''hh24:'
          ||'mi''), ''00:'
          ||'00'',''24:'
          ||'00'', TO_CHAR(s_datetime+.000011574,''hh24:'
          ||'mi'')) downtime,
          s_usage downusage,
          s_cost downcost
        FROM summary_qtrhour
        WHERE s_mtrid = '
        ||P_MTR_ID||
       ' AND s_mtrch   = ''1''
        AND s_datetime BETWEEN TO_DATE('
        ||P_FROM_DATE||
        ',''DD-MON-YY'') AND (TO_DATE('
        ||P_THROUGH_DATE||
        ',''DD-MON-YY'') + 1)
        ) a,
        (SELECT s_datetime + .000011574 s_datetime,
          s_usage downusage
        FROM summary_qtrhour
        WHERE s_mtrid = '
        ||P_MTR_ID||
        ' AND s_mtrch   = ''2''
        AND s_datetime BETWEEN TO_DATE('
        ||P_FROM_DATE||
        ',''DD-MON-YY'') AND (TO_DATE('
        ||P_THROUGH_DATE||
        ','' DD-MON-YY'') + 1)
        ) B
      where a.S_DATETIME = B.S_DATETIME(+)';
    SELECT DBMS_XMLQUERY.GETXML('L_QUERY') INTO L_XML   FROM DUAL;
    INSERT INTO NK VALUES (L_XML);
    DBMS_OUTPUT.PUT_LINE('L_QUERY IS :'||L_QUERY);
    END;
    OUTPUT parameters are in bold (the issue is they are coming without single quotes otherwise th equery is fine
    L_QUERY IS :SELECT
        a.s_datetime DATETIME,
        a.downdate Ending_date,
        a.downtime Ending_time,
        TO_CHAR(ROUND(a.downusage,3),'9999999.000') kWh_Usage,
        TO_CHAR(ROUND(a.downcost,2),'$9,999,999.00') kWh_cost,
        TO_CHAR(ROUND(B.DOWNUSAGE,3),'9999999.000') KVARH
      FROM
        (SELECT s_datetime + .000011574 s_datetime,
          TO_CHAR(S_DATETIME ,'mm/dd/yyyy') DOWNDATE,
          DECODE(TO_CHAR(s_datetime+.000011574 ,'hh24:mi'), '00:00','24:00', TO_CHAR(s_datetime+.000011574,'hh24:mi')) downtime,
          s_usage downusage,
          s_cost downcost
        FROM summary_qtrhour
        WHERE s_mtrid = N3165 AND s_mtrch   = '1'
        AND s_datetime BETWEEN TO_DATE(01-JAN-13,'DD-MON-YY') AND (TO_DATE(31-JAN-13,'DD-MON-YY') + 1)
        ) a,
        (SELECT s_datetime + .000011574 s_datetime,
          s_usage downusage
        FROM summary_qtrhour
        WHERE s_mtrid = N3165 AND s_mtrch   = '2'
        AND s_datetime BETWEEN TO_DATE(01-JAN-13,'DD-MON-YY') AND (TO_DATE(31-JAN-13,' DD-MON-YY') + 1)
        ) B
      where a.S_DATETIME = B.S_DATETIME(+)

    The correct way to handle this is to use bind variables.
    And use DBMS_XMLGEN instead of DBMS_XMLQUERY :
    create or replace procedure temp (
      p_mtr_id       in varchar2
    , p_from_date    in date
    , p_through_date in date
    is
      l_xml   CLOB;
      l_query VARCHAR2(2000);
      l_ctx   dbms_xmlgen.ctxHandle;
    begin
      l_query:=  'SELECT
        a.s_datetime DATETIME,
        a.downdate Ending_date,
        a.downtime Ending_time,
        TO_CHAR(ROUND(a.downusage,3),''9999999.000'') kWh_Usage,
        TO_CHAR(ROUND(a.downcost,2),''$9,999,999.00'') kWh_cost,
        TO_CHAR(ROUND(B.DOWNUSAGE,3),''9999999.000'') KVARH
      FROM
        (SELECT s_datetime + .000011574 s_datetime,
          TO_CHAR(S_DATETIME ,''mm/dd/yyyy'') DOWNDATE,
          DECODE(TO_CHAR(s_datetime+.000011574 ,''hh24:'
          ||'mi''), ''00:'
          ||'00'',''24:'
          ||'00'', TO_CHAR(s_datetime+.000011574,''hh24:'
          ||'mi'')) downtime,
          s_usage downusage,
          s_cost downcost
        FROM summary_qtrhour
        WHERE s_mtrid = :P_MTR_ID
        AND s_mtrch   = ''1''
        AND s_datetime BETWEEN TO_DATE(:P_FROM_DATE,''DD-MON-YY'')
                           AND (TO_DATE(:P_THROUGH_DATE,''DD-MON-YY'') + 1)
        ) a,
        (SELECT s_datetime + .000011574 s_datetime,
          s_usage downusage
        FROM summary_qtrhour
        WHERE s_mtrid = :P_MTR_ID
        AND s_mtrch   = ''2''
        AND s_datetime BETWEEN TO_DATE(:P_FROM_DATE,''DD-MON-YY'')
                           AND (TO_DATE(:P_THROUGH_DATE,'' DD-MON-YY'') + 1)
        ) B
      where a.S_DATETIME = B.S_DATETIME(+)';
      l_ctx := dbms_xmlgen.newContext(l_query);
      dbms_xmlgen.setBindValue(l_ctx, 'P_MTR_ID', p_mtr_id);
      dbms_xmlgen.setBindValue(l_ctx, 'P_FROM_DATE', to_char(p_from_date, 'DD-MON-YY'));
      dbms_xmlgen.setBindValue(l_ctx, 'P_THROUGH_DATE', to_char(p_through_date, 'DD-MON-YY'));
      l_xml := dbms_xmlgen.getXML(l_ctx);
      dbms_xmlgen.closeContext(l_ctx);
      insert into nk values (l_xml);
    end;

  • Crystal Data Conversion Issue (Error converting data type varchar to datetime)

    Hi,
    I can run stored procedure without error in SQL Server using my personal credentials as well as database credentials.
    I can also run Crystal Report after connecting to Stored procedure without error on my desktop using my personal credentials as well as database credentials.
    But when I upload the crystal report in BOBJDEV and when I run using database credentials report fails saying that "Error in File ~tmp1d1480b8e70fd90.rpt: Unable to connect: incorrect log on parameters. Details: [Database Vendor Code: 18456 ]" but I can run the crystal report successfully on BOBJDEV using my personal credentials.
    I googled (Data Conversion Error Message) about this issue & lot of people asked to do "Verify Database" in Crystal Report. So I did that, but when I do it I am getting a error message like this:
    Error converting data type varchar to datetime.
    Where do you think the error might be occurring? Did anyone faced this kind of issue before? If so, how to resolve it?
    (FYI, I am using Crystal Reports 2008, & for stored procedure I have used SSMS 2012 )
    Please help me with this issue.
    Thanks & Regards.
    Naveen.

    hello Naveen,
    since the report works fine in the cr designer / desktop, we need to figure out where you should post this question.
    by bobjdev do you mean businessobjects enterprise or crystal reports server? if so please post this question to the bi platform space.
    -jamie

  • How to convert Date in varchar(50) format MM/DD/YYYY HH:MM into YYYY-MM-DD format using MS SQLServer 2008 R2 ?

    Hi,
    I am getting the error "The conversion of a varchar data type to a datetime data type resulted in an out-of-range value."
    when converting date in format Date in varchar(50) format MM/DD/YYYY HH:MM into YYYY-MM-DD format using MS SQLServer 2008 R2.
    Please note that the date in column is Date(varchar(50), null).
    I used the following syntax:
    SELECT  CONVERT(VARCHAR(10), Date, 102) AS Day
    FROM   dbo.[RCap_2G MM/Operator]
    WHERE  (CONVERT(VARCHAR(10), Date, 102) > { fn NOW() } - 1)

    As noted above, either use ISDATE or TRY_CONVERT with the correct conversion style number:
    -- SQL Server 2012 code
    DECLARE @Date varchar(50) = '10/23/2006 10:20';
    SELECT TRY_CONVERT(DATE, @Date, 101) AS Day
    -- 2006-10-23
    Datetime conversion blog:
    http://www.sqlusa.com/bestpractices/datetimeconversion/
    Kalman Toth Database & OLAP Architect
    SQL Server 2014 Design & Programming
    New Book / Kindle: Exam 70-461 Bootcamp: Querying Microsoft SQL Server 2012

  • The data types varchar and varchar are incompatible in the subtract operator

    Hi ;
    I want to fetch values  6,903,00  format ,my query is ;
    SELECT CONVERT(varchar(50), CONVERT(money,SUM(DEBIT)),1) AS DEBIT ,CONVERT(varchar(50), CONVERT(money,SUM(CREDIT)),1),AS
    CREDIT CONVERT(varchar(50), CONVERT(money,SUM(DEBIT)),1) - CONVERT(varchar(50), CONVERT(money,SUM(CREDIT)),1) AS BALANCE
    FROM TABLE
    it was get error :  The data types varchar and varchar are incompatible in the subtract operator.
    I want to Show result ;
    DEBIT         -          CREDIT            -    BALANCE
    6,903,00              4,387.24             2,515.76
    Thanks in advance

    You have to do the subtraction with the MONEY data type (prior to covert-ing).
    Starting with SQL Server 2012, you can use the FORMAT command:
    https://msdn.microsoft.com/en-us/library/hh213505.aspx
    Kalman Toth Database & OLAP Architect
    SQL Server 2014 Database Design
    New Book / Kindle: Beginner Database Design & SQL Programming Using Microsoft SQL Server 2014
    We have to use SQL 2005 due to licensing issue .

  • Casting & Dates How to \ Can you....

    Hey Guys,
    I have a view:
    CREATE OR REPLACE VIEW MYVIEW AS
    SELECT
    to_char(logtime, 'DD-MM-YYYY') AS Logtime,
    count(things)
    FROM
    mytable
    GROUP BY
    to_char(logtime, 'DD-MM-YYYY')
    So all is good so far, well until i try to order my results on the logtime, as now the logtime is merely a Varchar! I have tried to cast the logtime back to a date after i have gotten it into the date format i want ('DD-MM-YYYY').
    I have the following:
    CREATE OR REPLACE VIEW MYVIEW AS
    SELECT
    cast(to_char(logtime, 'DD-MM-YYYY') as DATE) AS Logtime,
    count(things)
    FROM
    mytable
    GROUP BY
    to_char(logtime, 'DD-MM-YYYY')
    --ERROR: not a valid month (When i got to create the view)
    CREATE OR REPLACE VIEW MYVIEW AS
    SELECT
    cast(to_char(logtime, 'DD-MM-YYYY') as DATE) AS Logtime,
    count(things)
    FROM
    mytable
    GROUP BY
    cast(to_char(logtime, 'DD-MM-YYYY') as DATE)
    --ERROR: not a valid month (When i got to create the view)
    Basically is there a way to make sure that the date that comes out from the view is actually a sortable/orderable date?
    Thanks for any help
    Robert

    I have tried the following:
    CREATE OR REPLACE VIEW MYVIEW AS
    select to_char(logtime,'DD-MM-YYYY') AS LOGTIME,
    COUNT(ID)
    from PHISTORY
    where logtime > to_date('28-08-2007 05:00:00','DD-MM-YYYY HH24:MI:SS')
    and to_char(logtime,'DD-MM-YYYY') <> to_char(SYSDATE,'DD-MM-YYYY')
    group by to_char(logtime,'DD-MM-YYYY')
    and to_char(logtime,'DD-MM-YYYY') <> to_char(SYSDATE,'DD-MM-YYYY')I want to exclude today from the results. The query works fine giving me:
    31-08-2007     119603
    03-09-2007     163212
    28-08-2007     145559
    29-08-2007     135124
    04-09-2007     117235
    30-08-2007     145989
    02-09-2007     223881
    01-09-2007     235622
    When i add in:
    ORDER BY to_date(logtime,'DD-MM-YYYY')Everything works fine.
    Thanks for you input.
    Robert
    Message was edited by:
    DobSun

  • How to store bit data in VARCHAR(4000) field?

    Hi.
    Please help!
    We are porting some C/C++ software with embedded SQLs from NT/DB2 to Linux/Oracle.
    On NT/DB2 we have some table to store file data in a VARCHAR(4000) blocks.
    Table looks like this
    CREATE TABLE FileData (filetime as timestamp not null, idx int not null, datablock varchar(4000) FOR BIT DATA not null, primary key (filetime, idx) );
    As you can see DB2 has appropriate field modifier - "FOR BIT DATA" which makes DB2 storing data as-is, not converting characters.
    I need to know - if it is possible to do the same in Oracle like in DB2?
    If Oracle has some kind of field modifier like "FOR BIT DATA" in DB2?
    If not, how can I do the same in Oracle?
    The current problems are:
    1) when application imports the file with some national chars the Oracle stores "?" in a database in place of national chars.
    2) another piece of a problem - if file is more than 4000 bytes length, it reports the ORA-01461 error (see it is trying to expand some chars to UTF8 char which is not fit a single char, so finally - not fit the field size).
    So, it seems that it cannot proceed national chars at all. :-\
    For details please see enclosed [C code|http://dmitry-bond.spaces.live.com/blog/cns!D4095215C101CECE!1606.entry] , there is example how data written to a table.
    In other places we also need to read data from FIELDATA table and store back to file (other filename, other location).
    Here is summary on a field-datatype variants I have tried for the "datablock" field:
    1) VARCHAR2, RAW, LONG RAW, BLOB - does not work! All reports the same error - ORA-01461.
    2) CLOB, LONG - both working fine but(!) both still returns "?" instead of national chars on data reading.
    Hint: how I did try these field types - I just drop the "FileData" table, created it using different type for "datablock" field and run the same application to test it.
    I think I need to explain what the problem - we do not provide direct access to Oracle database, we use a some middle-ware. Middle-ware is a C/C++ software which also has a interface for dynamic SQLs execution. So, exactly this middle-ware (which is typically running on the same server with Oracle) receives the "?" instead of national chars! But we need it to return all data AS-IS(!) without any changes!!! That is wjhy I did ask - if Oracle has any options to store byte-data as-is?
    The BIG QUESTION - HOW CAN WE DO THIS?!
    Another thing I need to explain - it is ok to use Oracle-specific SQL ONLY IF THERE IS REALLY NO WAY TO ACHIEVE THIS WITH STANDARD SQL! Please.
    So, please look on a C code (by link I have posted above) and tell - if it is possible to make working in Oracle the VARCHAR approach we using at the moment?
    If not - please describe what options do we have for Oracle?
    Regards,
    Dmitry.
    PS. it is Oracle 11gR2 on CentOS 5.4, all stuff installed with default settings, so Oracle db encoding is "AL32UTF8".
    C/C++ application is built as ANSI/ASCII application (non-unicode), so sizeof(char)=1.
    The target Oracle db (I mean - the one which will be used on customer site) is Oracle 10g. So, solution need to be working on Oracle 10g.

    P. Forstmann wrote:
    There is some contradiction in your requirements:
    - if you want to store data as is without any translation use RAW or BLOB
    - if you want to store national character data try to use NVARCHAR2 or NCLOB.Seems you did not understand the problem. Ok, I'll try to explain. Please look on the code sample I provided in original question
    (I just added expanded data structures there, sorry I forgot to publish them when post original question):
    EXEC SQL BEGIN DECLARE SECTION;
      struct {
        char timestamp[27];
        char station[17];
        char filename[33];
        char task[17];
        char orderno[17];
        long filelen;
      gFilehead;
      struct {
        char timestamp[27];
        long idx;
        struct {
          short len;
          char arr[4001];
        } datablock;
      gFiledata;
    EXEC SQL END DECLARE SECTION;
    #define DATABLOCKSIZE 4000
    #ifdef __ORACLE
      #define VARCHAR_VAL(vch) vch.arr
    #elif __DB2
    #endif
    short dbWriteFile( char *databytes, long datalen )
      short nRc;
      long movecount;
      long offset = 0;
      gFilehead.filelen = gFilehead.filelen + datalen;
      while ((datalen + gFiledata.datablock.len) >= DATABLOCKSIZE)
        movecount = DATABLOCKSIZE - gFiledata.datablock.len;
        memcpy(&VARCHAR_VAL(gFiledata.datablock)[gFiledata.datablock.len], databytes, movecount);
        gFiledata.datablock.len = (short)(gFiledata.datablock.len + movecount);
        exec sql insert into filedata (recvtime, idx, datablock)
          values(
            :gFiledata.recvtime type as timestamp,
            :gFiledata.idx,
            :gFiledata.datablock /* <--- ORA-01461 appears here */
        nRc = sqlcode;
        switch (nRc)
        case SQLERR_OK: break;
        default:
          LogError(ERR_INSERT, "filedata", IntToStr(nRc), LOG_END);
          exit(EXIT_FAILURE);
        offset = offset + movecount;
        datalen = datalen - movecount;
        gFiledata.idx = gFiledata.idx + 1;
        memset(&gFiledata.datablock, 0, sizeof(gFiledata.datablock));
        databytes = databytes + movecount;
        gFiledata.datablock.len = 0;
      if (datalen + gFiledata.datablock.len)
        memcpy(&VARCHAR_VAL(gFiledata.datablock)[gFiledata.datablock.len], databytes, datalen);
        gFiledata.datablock.len = (short)(gFiledata.datablock.len + datalen);
      return 0;
    }So, the thing we need is - to put some data into the "datablock" field of following structure:
      struct {
        char timestamp[27];
        long idx;
        struct {
          short len;
          char arr[4001];
        } datablock;
      gFiledata;Then insert it into a database table using static SQL like this:
        exec sql insert into filedata (recvtime, idx, datablock)
          values(
            :gFiledata.recvtime type as timestamp,
            :gFiledata.idx,
            :gFiledata.datablock /* <--- ORA-01461 appears here */
            ); And then expect to read exactly the same data back!
    The problems are:
    1) Oracle make decision to convert the data we are inserting (why? and how to disable converting?!)
    2) even if it inserts the data (CLOB and LONG field datatypes are working fine when inserting data with such static SQL + such host variable) then it became not readable! (why?! how to make it readable?!)
    P. Forstmann wrote:
    ORA-01461 could mean that you have a wrong data type for bind variable variable in your client code:Not me decided that host variable is the "LONG datatype value" - the Oracle make that decision instead of me. And that is the problem!
    Looks like Oracle react on any char code >= 0x80.
    So, assume if I run the code:
    // if Tab1 was created as "CREATE TABLE Tab1 (value VARCHAR(5))" then
    char szData[10] = "\x41\x81\x82\x83\x84";
    EXEC SQL INSERT INTO Tab1 (value) VALUES (:szData);
    Oracle will report the ORA-01461 error!
    EXACTLY THIS IS THE PROBLEM I HAVE DESCRIBED IN MY ORIGINAL QUESTION.
    So, problem - why Oracle make such decision instead of me?! How we can make Oracle insert data into a table AS-IS?
    What other type of host variable we should use to make Oracle think that data is a binary?
    void*? unsigned char? Could you please provide any examples?
    Ok, you did recommend - "use the RAW datatype". But RAW datatype is limited to size 2000 bytes only - we need 4000! So, it is not match our needs at all.
    Also you have mentioned "use BLOB" - but testing shows that Oracle reports the same ORA-01461 error on inserting data into a BLOB field from such host variable! (see the code I posted)
    What also we can do?
    Change type of host variables? BUT HOW?!

  • How to convert date in varchar format to TimeZone format?

    Hi,
    Iam having a date '14-05-08 09:46:35 AM' (in Varchar format). How to convert this date to TimeZone ('IYYY-MM-DD"T"HH12:MI:SS"Z"FX') format?
    For Example,
    My input date is '14-05-08 09:46:35 AM' and I need output as '2008-05-14T09:46:35Z'.
    How to convert this?
    Thanks in Advance.

    Hi,
    You would look up the TO_TIMESTAMP and the TO_CHAR functions in the SQL reference manual for the version you don't mention, and make up the solution yourself, rather than asking someone else to do your homework.
    Sybrand Bakker
    Senior Oracle DBA

  • Does CAST ( date as timestamp) causes performance issues

    Hi
    does casting from DATE to TIMESTAMP in a query or in a view causes the slow down of performance??
    Please guide...
    Thanks
    Rimpi

    Everything you do affect performance. How significantly is a question answered by testing not by asking questions on an OTN forum.
    Create a loop doing it 10,000 times and find out.
    And, in the future, always include your version number.

  • Format the date in varchar type to mm/dd/yyyy

    Hi,
    I have a column originally in date format. Later on, I changed it to nvarchar and all the existing date changed to this format "yyyy-mm-dd 00:00:00". How could I update all those dates to mm/dd/yyyy format. Should I use the expression?
    Thanks. 

    I would highly recommend you change it back to a date/time type as this is what you are storing.
    MS Sql Server has MANY ways to return dates and times formatted as you want so depending on what you want to see and how you want to see it having the data as date time is infinity better. Case in point is your current predicament.
    Sorting and filtering and comparisons on date/time types is more efficient and less error prone
    Date/time types already have built in validation, trying to enter a date of february 30 is not possible or 27 hours etc.
    You can execute date/time functions like adding a year or subtracting a month which is very useful when you start to make use of the dates/times
    Writing code against databases where dates/times are stored as strings is a horrible experience that I do not wish on anyone!
    I currently have to maintain a DB that was originally created by my predecessor with date and times everywhere as varchar and it is a nightmare, Don't Do It especially if you have the chance now to revert back!!! :)
    -Igor

  • Cast date

    I need to cast the "first day of week value":
    Calendar cal = Calendar.getInstance();
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    int intweek = cal.get(Calendar.WEEK_OF_YEAR);
    cal.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);
    cal.set(Calendar.WEEK_OF_YEAR,intweek);
    String date=df.format(cal.getTime());
    //System.out.println("Date: "+date);
    PreparedStatement s = con.prepareStatement("SELECT * FROM [REPORT] WHERE [IdUrl] =? AND [IdUser] =? AND [Moment] >= ? ORDER BY [Moment] DESC");
    s.setInt(1, intat);
    s.setInt(2, Integer.parseInt(user));
    s.setDate(3, df.format(cal.getTime()));This code return an error:
    Incompatible type for method. Can't convert java.lang.String to java.sql.Date.Column [Moment] is a datetime field.
    Thanks
    Andreas

    Hi Andreas,
    According to the javadoc for class "java.text.DateFormat", all of the "format()" methods return "String"s.
    http://java.sun.com/j2se/1.4.1/docs/api/java/text/DateFormat.html
    So according to the code you have posted:
    s.setDate(3, df.format(cal.getTime()));the second method parameter is a "String" (and not a "Date").
    By the way, if [Moment] is a datetime field, you may actually need to use "java.sql.Timestamp" (and not "java.sql.Date") -- but this is only a guess (since it's not clear from your post which database and JDBC driver you are using).
    Hope this has helped you.
    Good Luck,
    Avi.

  • Ordering data type varchar

    I keep forgetting on how to order a column with datatype varchar
    One of my column for pricing has these values: 5,12,15,18,21,23,31 etc when I cfoutput my query result I got the list showing as: 12,15,18,21,23,31,5
    It should be from less price to higher prices: 5,12,15,18,21,23,31 but I can't make this happening because the datatype for this column is varchar.
    I know there is a way around but I can't remember, can someone help me?
    My query is real simple:
    select ranges, prices
    from fees
    order by prices and this doesn't work

    You don't specify what database system you are on.  Assuming SQL Server, how about:
    order by CAST(prices AS decimal(8,2))
    That assumes you might have prices that are not whole units of currency (up to six digits to the left of the decimal and two to the right).  You might need to adjust the scale and precision to your needs.  If the prices are always whole units of currency, then you could replace "decimal(8,2)" with "int".
    -Carl V.

Maybe you are looking for