mysql coldfusion coldfusion-9

Error de formato de fecha en ColdFusion y mySQL



coldfusion-9 (2)

Olvidó especificar una configuración regional . Cuando se omite, las funciones de fecha LS utilizan la configuración regional de la página actual. Suena como el tuyo es "English (US)". Según las convenciones de fecha de los Estados Unidos, el mes siempre es primero. Por lo tanto, la cadena "10/11/2014" siempre se tratará como el 10 de noviembre y no el 11 de octubre.

Dicho esto, si está completando una columna de fecha / hora, debe usar cfqueryparam y pasar objetos de fecha a la base de datos, en lugar de cadenas de fechas, que pueden malinterpretarse, dependiendo de la configuración de la base de datos.

Una opción es usar LSParseDateTime() con una LSParseDateTime() regional apropiada. No use ParseDateTime (). Al igual que la mayoría de las funciones de fecha estándar, siempre usa las reglas de fecha de EE. UU. Y producirá los mismos resultados incorrectos que está obteniendo ahora.

<cfset DateLocale = "English (UK)"> <cfset DateString = "11/10/2014"> ... <cfquery ...> INSERT INTO Table ( SomeColumn ) VALUES ( <cfqueryparam value="#LSParseDateTime(dateString, dateLocale)#" cfsqltype="cf_sql_timestamp"> ) </cfquery>

Además, para la validación, asegúrese de usar la versión LS de IsDate . De nuevo con la configuración regional apropiada.

<cfif LSIsDate( dateString, dateLocale )> .... </cfif>

NB: Tenga en cuenta que las funciones de fecha de CF son notoriamente "generosas" con respecto a lo que se considera válido. Si el formato de las cadenas de fechas puede variar, es posible que desee implementar su propia validación de fecha.

He configurado un archivo que lee un archivo xml de una base de datos e inserta esos datos en otro. Todo funciona bien excepto un extraño error en el formato de fecha. El formato de fecha que necesito es yyyy-mm-dd . Sin embargo, los datos originales se configuran como formato dd-mm-yyyy .

Mi código lee e inserta todos los datos, pero cuando lee el campo de fecha, hay un problema cuando el día es menor de 12. Curiosamente lo inserta al revés.

  • Si la fecha es el 11/10/2014 , se saca como 2014/11/10
  • Sin embargo, si la fecha es el 13/10/2014 , se 2014/10/13 como 2014/10/13 (que es correcta y lo que necesito).

Si configuro el tipo de campo MySQL para text o varchar , inserta el valor en el orden correcto, pero por supuesto no en un formato de fecha para ColdFusion. Entonces inserta una fecha como 11/10/2014, pero cuando configuro el mismo campo para escribir el formato ''fecha'' o incluso ''fecha y hora'', lo inserta en el formato correcto ''2014-10-11 pero con el problema anterior .

El código con el que estoy trabajando actualmente es:

<cfif isDate(arrA[currentField])> #currentField# = ''#LSdateformat(arrA[currentField],"yyyy-mm-dd")#'' <cfelse> #currentField# = ''#arrA[currentField]#'' </cfif>

Mi segundo intento fue usar lo siguiente:

<cfif isDate(arrA[currentField])> #currentField# = ''#ParseDateTime(arrA[currentField],"yyyy-mm-dd")#'' <cfelse> ...

Entonces recibo el siguiente error:

Usted tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de ''1900-01-01 00:00:00''} '', ScheduleReferenceNumber ='' TS8279631 '','' en la línea 15

En el tercer intento, utilicé:

<cfloop collection="#arrA#" item="currentField"> <cfif currentField NEQ ''TypeDesc''> <cfif fieldcount NEQ 0>,</cfif> <cfif currentField eq ''startDate''> <cfqueryparam cfsqltype="cf_sql_date" value="#currentField#"> <cfelse> #currentField# = ''#arrA[currentField]#'' </cfif> <cfset fieldCount=fieldCount+1> </cfif> </cfloop>

Pero luego entiendo el error:

La causa de esta excepción de salida fue la siguiente: coldfusion.runtime.locale.CFLocaleBase $ InvalidDateTimeException: StartDate es una cadena de fecha u hora no válida.

Habiendo probado también:

<cfset DateLocale = "English (UK)"> <cfset DateString = "11/10/2014"> <cfloop collection="#arrA#" item="currentField"> <cfif currentField NEQ ''TypeDesc''> <cfif fieldcount NEQ 0>,</cfif> <cfif currentField eq ''startDate''> <cfqueryparam value="#LSParseDateTime(dateString, dateLocale)#" cfsqltype="cf_sql_timestamp"> <cfelse> #currentField# = ''#arrA[currentField]#'' </cfif> <cfset fieldCount=fieldCount+1> </cfif> </cfloop> <cfif checkRecord.recordcount neq 0> WHERE ScheduleReferenceNumber = ''#arrA.ScheduleReferenceNumber#'' </cfif> </cfquery>

Obtengo lo siguiente:

Error al ejecutar la consulta de la base de datos.

Usted tiene un error en su sintaxis SQL; verifique el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '''' 2014-10-11 00: 00: 00.0 '', Currency ='' '', Tutor ='' '', CourseLoc'' en la línea 17


Suponiendo que el tipo de datos de su base de datos es una fecha o algo similar, está utilizando una función inapropiada. LSdateformat () convierte una fecha en una cadena. La función que convierte una cadena en una fecha es ParseDateTime ().

Si sus campos de fecha siempre llegan con el mismo formato, puede codificar el argumento de máscara apropiado de la función ParseDateTime (). Si varían, tendrás que usar la lógica condicional para determinar la máscara correcta.

También debe tener precaución al usar isDate (). Devuelve verdadero en algunos valores inesperados como "apr 31". Combinarlo con ReFind () y len () sería más completo.