CFQuery没有将时间部​​分保存到Oracle Datetime字段

coe*_*e57 2 sql oracle coldfusion coldfusion-11

我在使用Coldfusion的Oracle数据库中使用datetime字段时遇到问题,并且不知道如何解决它.

我有一个表(主题),其中包含一个日期时间字段("MODIFIED").如果我查看日期,我会获得04-JAN-17.如果我这样查询:

select to_char(MODIFIED, 'DD-MM-YYYY HH24:MI:SS') from Subject

它返回:

04-01-2017 09:57:43

我可以在ColdFusion中检索相同的结果.

然后,如果"MODIFIED"值已更改,我尝试将该数据复制到具有相同结构的另一个表.为此,我在第一个查询中检索数据并将其插入新表中.正确检索数据.特别是日期(我可以在ColdFusion脚本中看到它).但是,日期的时间丢失了.例如,我获得04-01-2017 00:00:00而不是04-01-2017 09:57:43.

这是我的脚本的相关部分:

主页:

<!-------- Get data -------->
<cfquery name="select_Subject_to_insert" datasource="#application.datasource#">
    SELECT CODE, MODIFIED, NAME FROM Subject 
</query>


<cfloop query="select_Subject_to_insert"> 
    <!-------- Create an object "Subject" -------->
    <cfscript>
        subject_to_insert = createObject("component", "Subject").init();
        subject_to_insert.id = -1;
        subject_to_insert.Code = select_Subject_to_insert.CODE;
        subject_to_insert.modified = select_Subject_to_insert.MODIFIED;
        subject_to_insert.name = select_Subject_to_insert.NAME;             
    </cfscript>
    <!-------- Call the function for saving data -------->
    saveSubject(subject_to_insert)
</cfloop>
Run Code Online (Sandbox Code Playgroud)

主要成分:

<!--- Function to save (update) Subject. --->
<cffunction name="saveSubject" returntype="string" access="remote">     
    <cfargument name="subject" required="yes" type="vo.Subject" />
    <cfset var timestp = createTimeStamp() />

    <!--- insert --->   
    <cfquery name="insertSubject" datasource="#application.datasource#" result="insertSubjectResult">
        insert into Subject (
            CODE,
            MODIFIED,
            NAME
            TIMESTAMP
        )values ( 
            <cfqueryparam value="#arguments.subject.CODE#" null="no" cfsqltype="cf_sql_varchar"/>,                                                  
            <cfqueryparam value="#arguments.subject.MODIFIED#" null="no" cfsqltype="cf_sql_date"/>,                         
            <cfqueryparam value="#arguments.subject.NAME#" null="no" cfsqltype="cf_sql_varchar"/>,                          
            <cfqueryparam value="#timestp#" null="no" cfsqltype="cf_sql_numeric"/>                          
        )
    </cfquery>

    ........................................

</cffunction>   
Run Code Online (Sandbox Code Playgroud)

你能帮我理解为什么没有正确插入时间并解决问题吗?

MT0*_*MT0 6

你想用:

<cfqueryparam value="#arguments.subject.MODIFIED#" null="no" cfsqltype="cf_sql_timestamp"/>
Run Code Online (Sandbox Code Playgroud)

cf_sql_date类型没有时间组件,cf_sql_timestamp但确实如此.您可以检查文档中的兼容性矩阵,以查看cf_sql_timestamp与Oracle DATE数据类型相对应的内容.

您还可以简化页面以摆脱函数调用(假设它没有进行额外处理):

<cfquery name="insertSubject" datasource="#application.datasource#" result="insertSubjectResult">
  insert into Subject (
    CODE,
    MODIFIED,
    NAME
    TIMESTAMP
  )
  SELECT code,
         modified,
         name,
         <cfqueryparam value=createTimeStamp() null="no" cfsqltype="cf_sql_numeric"/>
  FROM   subject
  -- WHERE some_condition
</cfquery>
Run Code Online (Sandbox Code Playgroud)