ColdFusion:将一个变量中的日期时间插入数据库Oracle10

时间:2016-05-16 04:23:39

标签: sql datetime variables coldfusion oracle10g

我已经坚持这个问题一个小时了。我正在使用ColdFusion语言。在我的代码中,我想将datetime插入到我的数据库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")>

在我的表中,属性date_print的格式为DATE

当我点击按钮将datetime插入我的数据库Oracle时,这是快照:

enter image description here

更新

这是将数据插入数据库的功能

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

在我的表格中,属性date_print仅显示date format

enter image description here

但在ColdFusion中,我发送格式日期和时间,如2016-05-16 14:12:35

但如果我想查看我的时间格式,我需要点击铅笔图标。

enter image description here

希望任何人都可以帮我解决这个问题。

谢谢

2 个答案:

答案 0 :(得分:2)

您正在通过CF_SQL_TIMESTAMP。您需要将<cfqueryparam cfsqltype="CF_SQL_TIMESTAMP" value="#convertDate(trim(listGetAt(value, item,';')))#"> 作为cfsqltype传递。

您的cfqueryparam应如下所示:

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setFont(new Font("SansSerif", Font.BOLD, 18));

        Graphics2D graphics = (Graphics2D) g;
        graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        graphics.drawString(s, 5, 20);

cf_sql_date将日期时间截断为日期值(实际上计算为数值),其中cf_sql_timestamp使用完整的日期时间戳。

答案 1 :(得分:1)

你在这里发生了一些事情。

Oracle存储DATE数据类型,其值包含世纪,年,月,日,小时,分钟和秒。有点不同的是MS SQL的epoch存储,但您仍然可以访问日期数据类型中的时间值。如果您需要更高的精度,TIMESTAMP数据类型可以为您提供小数点后的5或6位数字(这么多毫秒)。

为了存储日期时间,Tushar是正确的。您应该使用CF_SQL_TIMESTAMP而不是CF_SQL_DATE。对于Oracle,TIMESTAMP值将为您提供您正在寻找的小时:分钟:秒精度。 Oracle的数据类型非常敏感(而MS SQL有时会更宽容),我相信CF_SQL_DATE(可以在MSSQL中运行)作为整数返回,时间部分被截断(给你0小时,0分和0秒)和CF_SQL_TIMESTAMP是Oracle(和其他数据库,如SQL Server)可以更好地理解的实际时间戳对象。所以使用TIMESTAMP而不是DATE。

截断是您在单击以编辑值时看到0:0:0的原因。

您的查询工具本身就是您看到按照您的方式格式化日期的原因。 我不确定您使用的是哪一个,但要更改SQL Developer中的显示,请转到工具&gt;&gt;偏好设置&gt;&gt;点击NLS&gt;使用您要使用的蒙版编辑日期格式(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”不同。

此外,在一般代码审查说明中:请验证您的输入(尤其是表名)并在queryparam中使用maxlength参数。 insertData()看起来非常可注射。此外,如果这是CF> 9,请不要使用var local。 LOCAL范围现在内置于ColdFusion中。它不应该破坏任何东西,但你并没有真正做你的代码认为它正在做的事情。