ColdFusion: вставить дату в одну переменную в базу данных Oracle10

0 Fai Zal Dong [2016-05-16 07:23:00]

Я застрял с этой проблемой в течение одного часа. Я использую язык ColdFusion. В моем коде я хочу вставить datetime в мою базу данных Oracle. Формат Datetime будет выглядеть так:

<cfset form.date_print = #dateFormat(Now(),"yyyy-mm-dd") & " " & timeFormat(now(), "HH:mm:ss")#>

и функция вставки моего datetime в мою базу данных будет выглядеть так:

<cfset qAdd = APPLICATION.qbs.insertData(column:'date_print,usr_id_print,qsd_id,loc_id',formData:'#FORM#',table:"qpl_print_log")>

В моей таблице формат атрибута date_print равен DATE.

Это моментальный снимок, когда я нажимаю кнопку, чтобы вставить дату и время в мою базу данных 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

Надеюсь, кто-нибудь может помочь мне решить эту проблему.

спасибо

variables coldfusion sql oracle10g datetime


2 ответа


2 Решение Tushar Bhaware [2016-05-16 13:04:00]

Вы передаете 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 использует метку времени полной даты.


1 Shawn [2016-05-16 23:18:00]

У вас здесь есть пара вещей.

Oracle хранит типы данных DATE со значениями для век, года, месяца, дня, часа, минуты и секунды. Разница в том, что хранилище эпохи MS SQL, но у вас все еще есть доступ к вашим значениям времени в типе даты. Если вам нужна более высокая точность, тип данных 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, перейдите в Инструменты >> Настройки >> Нажмите NLS> Изменить формат даты с помощью маски, которую вы хотите использовать (ГГГГ-ММ-ДД HH24: MI: СС). Это отобразит ваш запрос с нужным форматом даты. TOAD или другие должны иметь что-то подобное.

Примерно на полпути вниз страница представляет собой диаграмму с применимым сопоставлением CF для сопоставления данных. https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-pq/cfqueryparam.html

Будьте осторожны при использовании маскировки даты. Различные системы делают разные вещи, а "y" может отличаться от "Y", даже в ColdFusion.

Кроме того, в обзоре общего обзора кода: Пожалуйста, проверьте свои входы (особенно имя таблицы) и используйте аргумент maxlength в вашем запросе. insertData() выглядит очень инъецируемым. Кроме того, если это CF> 9, не используйте var local. Область LOCAL теперь встроена в ColdFusion. Это не должно ничего сломать, но вы действительно не делаете то, что ваш код думает, что он делает.