2015-09-23 2 views
2

Я работаю над формой отправки для событий, которые когда-то были завершены, отправляется на страницу обработки и обновляет базу данных.Усечение данных: неверное значение даты и времени - coldfusion

У меня есть четырнадцать полей, некоторые из которых необходимы, одна из которых - дата и время события.

Во время обработки формы я соединяю записи двух форм, дату и время перед попыткой вставки в базу данных, но возникает ошибка.

усечение данных: Неправильное значение даты и времени

Вот кодовые элементы, которые не имеют успеха

<cfset insdate = form["date"] & form["time"]> 
<cfset new_date = #CREATEODBCDATETIME(insdate)#> 

<cfif len(trim("#institle#"))> 
     <cfquery name="modify"> 
      INSERT INTO table 
      SET 
      title = <cfqueryparam      
        cfsqltype="CF_SQL_LONGVARCHAR" 
        value="#institle#">, 
      dateTime = <cfqueryparam 
        cfsqltype="CF_SQL_LONGVARCHAR" 
        value="#new_date#">, 
      location = <cfqueryparam 
        cfsqltype="CF_SQL_LONGVARCHAR" 
        value="#inslocation#">, 
      category = <cfqueryparam 
        cfsqltype="CF_SQL_SMALLINT" 
        value="#inscategory#">, 
      type = <cfqueryparam 
        cfsqltype="CF_SQL_TINYINT" 
        value="#instype#">         
     </cfquery> 
</cfif> 

Я обрезается выше код, чтобы сделать его короче и легче читать. Если у кого-то есть идеи, что я делаю неправильно, это было бы здорово.

Я запускаю Coldfusion 8, базу данных mySQL и базу данных принимает дату и время в соответствующем поле в формате yyyy-mm-dd hh: mm: ss.

Cheers.

+1

Для вашего значения dateTime вы указали 'cfsqltype =" CF_SQL_LONGVARCHAR "'. Вместо этого попробуйте 'cfsqltype =" CF_SQL_TIMESTAMP "'. –

+1

* база данных принимает дату и время в соответствующем поле в формате yyy-mm-dd hh: mm: ss * Хотя технически он может принимать строки, значения даты/времени почти всегда сохраняются как числа внутри. Для согласованных результатов вы должны использовать 'cf_sql_timestamp' (дата и время) - как предложил Мигель OR' cf_sql_date' (только для даты). Кроме того, игнорируя валидацию на мгновение - вы подтвердили, что 'new_date' фактически содержит ожидаемый объект даты? Я заметил, что между form.date и form.time нет места. – Leigh

+0

Спасибо вам обоим. Я был связан с проблемой объединения двух элементов формы, которые полностью меня полностью перебросили. – BoBFiSh

ответ

1

ColdFusion может обрабатывать строковые представления нескольких форматов datetime, используя cfSqlType="CF_SQL_TIMESTAMP", как уже было предложено. Нет необходимости создавать объект даты (времени) для запроса вообще. Просто убедитесь, что isDate(yourDateTimeString) возвращает true для строки (потому что это будет предполагать CF_SQL_TIMESTAMP), и помните о различиях в локали. (ddmmyyyy и mmddyyyy - два неприятных формата, которые будут замешаны ColdFusion, я им гарантирую.)

+0

Также верно! вы можете просто проверить входные данные формы yoru, чтобы узнать, являются ли они датой и/или временем в вашей процедуре проверки. если вам не нужна строка времени даты ODBC. который действительно подходит для определенного типа _driver_ и форматов как {d '...'} Я думаю ... эти скобки в большинстве случаев потерпели бы неудачу. –

+1

* Нет необходимости создавать объект даты (времени) для запроса вообще * Я не согласен. Технически, да - вы могли бы просто передать строку с форматированной датой * правильно *.Однако, учитывая известную «широкую» интерпретацию CF того, что она считает допустимой строкой даты, вам гораздо лучше выполнять свою собственную проверку и создавать объекты даты IMO ;-). @BoBFiSh. Что касается форматов, большинство стандартных функций даты будут принимать американские правила даты. Так, как сказал Александар, будьте внимательны к текущему языку и когда вам нужно использовать функции LS. – Leigh

+0

@MarkAKruger - Да, но формат строки не вступает в игру, если вы используете его с соответствующим cfsqltype. Поскольку CreateODBCDateTime возвращает объект даты, cfqueryparam не нужно «интерпретировать» его (как это происходит со строками). CF/JDBC просто передает объект java.util.Date через базу данных. Предоставлено множество других функций, которые также возвращают объекты даты, без обертки «ODBC», но в контексте они не сильно отличаются от других объектов даты (Side note, «ODBC» является немного неправильным. Он работает с * * J ** DBC тоже ;-) – Leigh

1

Просто перерезайте погоню здесь. Измените свой код:

<!--- create a date object ---> 
<cfset new_date = CREATEODBCDATETIME(insdate)> 
<!--- format for the DB ---> 
<cfset new_date = dateformat (new_date, 'yyyy-mm-dd') & ' ' & timeformat(new_date,'HH:mm:ss')> 

Посмотрите, вставьте ли эти вставки для себя. большинство БД берут строку и неявно конвертируют в dattime внутри.

+0

Смотрите мой комментарий ниже. alex прав, что вы действительно не выполняете функцию createodbcdatetime() ... вам также не нужны значки фунта в вашем заявлении cfset. –

+0

Предполагая, что они используют cfsqltype = "cf_sql_timestamp", это заставит много ненужных (неявных) преобразований: 1. string => date 2. date => string 3. string => date. (Не говоря уже о местах, где конверсии могут перешагнуть ;-) Игнорируя проверку на данный момент, просто передайте объект даты, возвращенный CreateAdBCDateTime, в cfqueryparam, и это все. – Leigh

+0

* большинство БД берут строку и неявно конвертируют в dattime внутри. * Правда, но в целом [полагаясь на неявное преобразование - это не очень хорошая идея] (http://stackoverflow.com/questions/27049918/coldfusion-parameterizing-a- querie/27066113) ИМО. Всегда проверяйте и используйте объекты даты, чтобы вы точно знали, какими будут результаты. (Извините, слишком устал, чтобы написать «формальный» ответ, но много сообщений в моем профиле о датах :) – Leigh

Смежные вопросы