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>
我在使用 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>