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

CFQuery not saving time portion to Oracle Datetime field

我在使用 Coldfusion 的 Oracle 数据库中的日期时间字段时遇到问题,不知道如何解决。

我有一个 table(主题),其中包含一个日期时间字段 ("MODIFIED")。例如,如果我查看日期,我会获得 04-JAN-17。如果我执行此查询:

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

它returns:

04-01-2017 09:57:43

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

然后,如果 "MODIFIED" 值已更改,我会尝试将该数据复制到具有相同结构的另一个 table。为此,我在第一个查询中检索了数据并将其插入到新的 table 中。数据被正确检索。特别是日期(我可以在 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>

主要成分:

<!--- 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>   

能否请您帮我理解为什么时间输入不正确并解决问题?

您想使用:

<cfqueryparam value="#arguments.subject.MODIFIED#" null="no" cfsqltype="cf_sql_timestamp"/>

cf_sql_date 类型没有时间组件,而 cf_sql_timestamp 有。您可以检查 the documentation 中的兼容性矩阵以查看 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>