ColdFusion:将一个变量中的日期时间插入数据库 Oracle10
ColdFusion: Insert Date Time in One Variable Into Database Oracle10
这个问题我坚持了一个小时。我正在使用 ColdFusion 语言。在我的代码中,我想将日期时间插入到我的数据库 Oracle 中。日期时间格式将如下所示:
<cfset form.date_print = #dateFormat(Now(),"yyyy-mm-dd") & " " & timeFormat(now(), "HH:mm:ss")#>
将日期时间插入数据库的函数如下所示:
<cfset qAdd = APPLICATION.qbs.insertData(column:'date_print,usr_id_print,qsd_id,loc_id',formData:'#FORM#',table:"qpl_print_log")>
在我的 table 中,属性 date_print 的格式是 DATE
。
这是我单击按钮将日期时间插入我的数据库 Oracle 时的快照:
更新
这是向数据库插入数据的函数
<cffunction name="insertData" access="public" returntype="struct" output="no">
<cfargument name="column" required="true" type="string" hint="data">
<cfargument name="value" required="false" type="string" hint="data">
<cfargument name="formData" required="false" type="struct" hint="data">
<cfargument name="table" required="true" type="string" hint="table">
<cfargument name="dateType" required="false" type="string">
<cfargument name="sqlNvarcharType" required="false" type="string">
<cfargument name="returnID" required="true" type="boolean" default="true">
<cfargument name="db" required="false" type="string" hint="data" default="#variables.db.db_datasource_ro#">
<cfset var local = {}>
<cfset local.counter = 0>
<cfset local.return = {}>
<cfset local.return.status = "OK">
<cfset local.return.id = 0>
<cfset local.return.cuid = APPLICATION.cuid.getCUID()>
<cfif ListFind(column,"submit")>
<cfset column = ListDeleteAt( column, ListFind(column,"submit")) >
</cfif>
<cftry>
<cfquery name="local.insertData" datasource="#db#" result="myresult">
INSERT INTO #table#(#column#,cuid) VALUES(
<cfif isDefined('Arguments.value') AND Arguments.value NEQ "">
<cfloop from="1" to="#ListLen(Arguments.value,';')#" index="item">
<cfif isDefined('Arguments.dateType') AND ListFind(dateType,item)><cfqueryparam cfsqltype="cf_sql_date" value="#convertDate(trim(listGetAt(value, item,';')))#">
<cfelseif isDefined('Arguments.sqlNvarcharType') AND ListFind(sqlNvarcharType,item)><cfqueryparam cfsqltype="cf_sql_nvarchar" value="#trim(listGetAt(value, item,';'))#">
<cfelse><cfqueryparam cfsqltype="cf_sql_char" value="#trim(listGetAt(value, item,';'))#"></cfif><cfif item LT ListLen(column)>,</cfif>
</cfloop>
<cfelse>
<cfloop list="#column#" index="theField">
<cfset local.counter = local.counter+1>
<cfif isDefined('Arguments.dateType') AND ListFind(dateType,theField)><cfqueryparam cfsqltype="cf_sql_date" value="#convertDate(formData[theField])#">
<cfelseif isDefined('Arguments.sqlNvarcharType') AND ListFind(sqlNvarcharType,theField)><cfqueryparam cfsqltype="cf_sql_nvarchar" value="#trim(formData[theField])#">
<cfelse><cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(formData[theField])#"></cfif><cfif local.counter LT ListLen(column)>,</cfif>
</cfloop>
</cfif>
,'#local.return.cuid#')
</cfquery>
<cfif Arguments.returnID EQ true>
<cfquery name="qetAutoIncrementID" datasource="#db#">
SELECT id
FROM #table#
WHERE cuid = '#local.return.cuid#'
</cfquery>
<cfset local.return.id = qetAutoIncrementID.id>
</cfif>
<cfcatch>
<cfset local.return.status = "BAD">
<cfset local.return.cfcatch = cfcatch>
<cfset APPLICATION.db.notifyError(functionname:"Insert:#table#", args:ARGUMENTS, cfcatch:cfcatch)>
</cfcatch>
</cftry>
<cfreturn local.return>
</cffunction>
在我的 table 中,属性 date_print 仅显示 date format
。
但是在 ColdFusion 中,我发送格式日期和时间是这样的 2016-05-16 14:12:35
。
但是如果我想查看我的时间格式,我需要单击铅笔图标。
希望有人能帮我解决这个问题。
谢谢
你超过了cfsqltype as cf_sql_date
。您需要传递 CF_SQL_TIMESTAMP
作为您的 cfsqltype。
您的 cfqueryparam 应如下所示:
<cfqueryparam cfsqltype="CF_SQL_TIMESTAMP" value="#convertDate(trim(listGetAt(value, item,';')))#">
cf_sql_date 将日期时间截断为日期值(实际上计算为数值),而 cf_sql_timestamp 使用完整的日期时间戳。
这里发生了一些事情。
Oracle 存储具有世纪、年、月、日、小时、分钟和秒值的 DATE 数据类型。与 MS SQL 的纪元存储有点不同,但您仍然可以访问日期数据类型中的时间值。如果您需要更高的精度,我认为 TIMESTAMP 数据类型可以提供小数点后 5 或 6 位数字(这么多毫秒)。
对于存储日期时间,Tushar 是正确的。您应该使用 CF_SQL_TIMESTAMP 而不是 CF_SQL_DATE。对于 Oracle,TIMESTAMP 值将为您提供所需的 hour:minute:second 精度。 Oracle 对数据类型非常敏感(而 MS SQL 有时可以更宽容),我相信 CF_SQL_DATE(将在 MSSQL 中工作)作为带有时间部分的整数返回截断(给你 0 小时、0 分钟和 0 秒),CF_SQL_TIMESTAMP 是 Oracle(和其他数据库,如 SQL 服务器)可以更好地理解的实际时间戳对象。所以使用 TIMESTAMP 而不是 DATE。
截断是您在单击以编辑值时看到 0:0:0 的原因。
您的查询工具本身就是您看到日期格式的原因。
我不确定您使用的是哪个,但要更改 SQL Developer 中的显示,请转至工具 >> 首选项 >> 单击 NLS > 使用您要使用的掩码编辑日期格式 (YYYY-MM- DD HH24:MI:SS)。这将以您想要的日期格式显示您的查询。 TOAD 或其他人应该有类似的东西。
页面的大约一半是一个图表,其中包含适用于数据类型比较的 CF。
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-p-q/cfqueryparam.html
使用日期屏蔽时要小心。不同的系统做不同的事情,即使在 ColdFusion 中,"y" 也可能与 "Y" 不同。
此外,关于一般代码审查说明:请验证您的输入(尤其是 table 名称)并在您的查询参数中使用最大长度参数。 insertData() 看起来很 injectable。此外,如果这是 CF >9,请不要使用 var local。 LOCAL 作用域现在内置于 ColdFusion 中。它不应该破坏任何东西,但你并没有真正按照你的代码认为它在做什么。
这个问题我坚持了一个小时。我正在使用 ColdFusion 语言。在我的代码中,我想将日期时间插入到我的数据库 Oracle 中。日期时间格式将如下所示:
<cfset form.date_print = #dateFormat(Now(),"yyyy-mm-dd") & " " & timeFormat(now(), "HH:mm:ss")#>
将日期时间插入数据库的函数如下所示:
<cfset qAdd = APPLICATION.qbs.insertData(column:'date_print,usr_id_print,qsd_id,loc_id',formData:'#FORM#',table:"qpl_print_log")>
在我的 table 中,属性 date_print 的格式是 DATE
。
这是我单击按钮将日期时间插入我的数据库 Oracle 时的快照:
更新
这是向数据库插入数据的函数
<cffunction name="insertData" access="public" returntype="struct" output="no">
<cfargument name="column" required="true" type="string" hint="data">
<cfargument name="value" required="false" type="string" hint="data">
<cfargument name="formData" required="false" type="struct" hint="data">
<cfargument name="table" required="true" type="string" hint="table">
<cfargument name="dateType" required="false" type="string">
<cfargument name="sqlNvarcharType" required="false" type="string">
<cfargument name="returnID" required="true" type="boolean" default="true">
<cfargument name="db" required="false" type="string" hint="data" default="#variables.db.db_datasource_ro#">
<cfset var local = {}>
<cfset local.counter = 0>
<cfset local.return = {}>
<cfset local.return.status = "OK">
<cfset local.return.id = 0>
<cfset local.return.cuid = APPLICATION.cuid.getCUID()>
<cfif ListFind(column,"submit")>
<cfset column = ListDeleteAt( column, ListFind(column,"submit")) >
</cfif>
<cftry>
<cfquery name="local.insertData" datasource="#db#" result="myresult">
INSERT INTO #table#(#column#,cuid) VALUES(
<cfif isDefined('Arguments.value') AND Arguments.value NEQ "">
<cfloop from="1" to="#ListLen(Arguments.value,';')#" index="item">
<cfif isDefined('Arguments.dateType') AND ListFind(dateType,item)><cfqueryparam cfsqltype="cf_sql_date" value="#convertDate(trim(listGetAt(value, item,';')))#">
<cfelseif isDefined('Arguments.sqlNvarcharType') AND ListFind(sqlNvarcharType,item)><cfqueryparam cfsqltype="cf_sql_nvarchar" value="#trim(listGetAt(value, item,';'))#">
<cfelse><cfqueryparam cfsqltype="cf_sql_char" value="#trim(listGetAt(value, item,';'))#"></cfif><cfif item LT ListLen(column)>,</cfif>
</cfloop>
<cfelse>
<cfloop list="#column#" index="theField">
<cfset local.counter = local.counter+1>
<cfif isDefined('Arguments.dateType') AND ListFind(dateType,theField)><cfqueryparam cfsqltype="cf_sql_date" value="#convertDate(formData[theField])#">
<cfelseif isDefined('Arguments.sqlNvarcharType') AND ListFind(sqlNvarcharType,theField)><cfqueryparam cfsqltype="cf_sql_nvarchar" value="#trim(formData[theField])#">
<cfelse><cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(formData[theField])#"></cfif><cfif local.counter LT ListLen(column)>,</cfif>
</cfloop>
</cfif>
,'#local.return.cuid#')
</cfquery>
<cfif Arguments.returnID EQ true>
<cfquery name="qetAutoIncrementID" datasource="#db#">
SELECT id
FROM #table#
WHERE cuid = '#local.return.cuid#'
</cfquery>
<cfset local.return.id = qetAutoIncrementID.id>
</cfif>
<cfcatch>
<cfset local.return.status = "BAD">
<cfset local.return.cfcatch = cfcatch>
<cfset APPLICATION.db.notifyError(functionname:"Insert:#table#", args:ARGUMENTS, cfcatch:cfcatch)>
</cfcatch>
</cftry>
<cfreturn local.return>
</cffunction>
在我的 table 中,属性 date_print 仅显示 date format
。
但是在 ColdFusion 中,我发送格式日期和时间是这样的 2016-05-16 14:12:35
。
但是如果我想查看我的时间格式,我需要单击铅笔图标。
希望有人能帮我解决这个问题。
谢谢
你超过了cfsqltype as cf_sql_date
。您需要传递 CF_SQL_TIMESTAMP
作为您的 cfsqltype。
您的 cfqueryparam 应如下所示:
<cfqueryparam cfsqltype="CF_SQL_TIMESTAMP" value="#convertDate(trim(listGetAt(value, item,';')))#">
cf_sql_date 将日期时间截断为日期值(实际上计算为数值),而 cf_sql_timestamp 使用完整的日期时间戳。
这里发生了一些事情。
Oracle 存储具有世纪、年、月、日、小时、分钟和秒值的 DATE 数据类型。与 MS SQL 的纪元存储有点不同,但您仍然可以访问日期数据类型中的时间值。如果您需要更高的精度,我认为 TIMESTAMP 数据类型可以提供小数点后 5 或 6 位数字(这么多毫秒)。
对于存储日期时间,Tushar 是正确的。您应该使用 CF_SQL_TIMESTAMP 而不是 CF_SQL_DATE。对于 Oracle,TIMESTAMP 值将为您提供所需的 hour:minute:second 精度。 Oracle 对数据类型非常敏感(而 MS SQL 有时可以更宽容),我相信 CF_SQL_DATE(将在 MSSQL 中工作)作为带有时间部分的整数返回截断(给你 0 小时、0 分钟和 0 秒),CF_SQL_TIMESTAMP 是 Oracle(和其他数据库,如 SQL 服务器)可以更好地理解的实际时间戳对象。所以使用 TIMESTAMP 而不是 DATE。
截断是您在单击以编辑值时看到 0:0:0 的原因。
您的查询工具本身就是您看到日期格式的原因。 我不确定您使用的是哪个,但要更改 SQL Developer 中的显示,请转至工具 >> 首选项 >> 单击 NLS > 使用您要使用的掩码编辑日期格式 (YYYY-MM- DD HH24:MI:SS)。这将以您想要的日期格式显示您的查询。 TOAD 或其他人应该有类似的东西。
页面的大约一半是一个图表,其中包含适用于数据类型比较的 CF。 https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-p-q/cfqueryparam.html
使用日期屏蔽时要小心。不同的系统做不同的事情,即使在 ColdFusion 中,"y" 也可能与 "Y" 不同。
此外,关于一般代码审查说明:请验证您的输入(尤其是 table 名称)并在您的查询参数中使用最大长度参数。 insertData() 看起来很 injectable。此外,如果这是 CF >9,请不要使用 var local。 LOCAL 作用域现在内置于 ColdFusion 中。它不应该破坏任何东西,但你并没有真正按照你的代码认为它在做什么。