CFQuery не сохраняет часть времени в поле Oracle Datetime

У меня проблема с использованием поля даты и времени в базе данных Oracle с Coldfusion, и я не знаю, как ее решить.

У меня есть таблица (Тема), которая содержит поле даты и времени ("ИЗМЕНЕНО"). Если я смотрю дату, я получаю, например, 04-JAN-17. Если я сделаю этот запрос:

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

Он возвращает:

04-01-2017 09:57:43

Я могу получить тот же результат в ColdFusion.

Затем я пытаюсь скопировать эти данные в другую таблицу с той же структурой, если значение «ИЗМЕНЕНО» изменилось. Для этого я получил данные в первом запросе и вставил их в новую таблицу. Данные извлекаются корректно. Особенно дату (я ее вижу в скрипте ColdFusion). Однако время даты теряется. Например, я получаю 01-04-2017 00:00:00 вместо 01-04-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>   

Не могли бы вы помочь мне понять, почему время вставлено неправильно, и решить проблему?


person coeurdange57    schedule 31.03.2017    source источник


Ответы (1)


Вы хотите использовать:

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

Тип cf_sql_date не имеет компонента времени, тогда как cf_sql_timestamp имеет. Вы можете проверить матрицу совместимости в документации. что 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>
person MT0    schedule 31.03.2017
comment
Проблема не в отметке времени (последнее поле). Если я удалю поле базы данных и в запросах будет та же проблема. Это поле MODFIED (поле данных) настоящая проблема. - person coeurdange57; 31.03.2017
comment
@ coeurdange57 Пожалуйста, перечитайте первую часть моего ответа - вам нужно использовать тип cf_sql_timestamp при передаче значения в параметр запроса для столбца MODIFIED. - person MT0; 31.03.2017
comment
Хорошо, но я должен поместить старое измененное значение в поле MODIFIED новой таблицы, а не метку времени. Как я могу это сделать? - person coeurdange57; 31.03.2017
comment
@ coeurdange57 Вы пробовали заменить cf_sql_date на cf_sql_timestamp? Это должно быть единственное изменение, которое необходимо в вашем коде. - person MT0; 31.03.2017
comment
CF_SQL_DATE аналогичен литералу даты ANSI, а CF_SQL_TIMESTAMP — литералу метки времени ANSI. Таким образом, несмотря на то, что Oracle DATE может хранить время, а также дату (хотя и с меньшей точностью, чем Oracle TIMESTAMP), вам нужно будет использовать CF_SQL_TIMESTAMP, чтобы сохранить временную часть для Oracle DATE (или, если уж на то пошло, SQL-сервер datetime). - person David Faber; 01.04.2017