ColdFusion和mySQL中的日期格式错误

时间:2014-06-11 18:40:56

标签: mysql coldfusion coldfusion-9

我已经设置了一个从一个数据库读取xml文件并将该数据插入另一个数据库的文件。一切正常,除了日期格式的奇怪错误。我需要的日期格式为yyyy-mm-dd。但是,原始数据设置为格式dd-mm-yyyy

我的代码读取并插入所有数据,但是当它读取日期字段时,当一天不到12时就会出现问题。奇怪的是,它会以相反的方式插入。

  • 如果日期为11/10/2014,则会将其拉为2014/11/10
  • 但是,如果日期为13/10/2014,则会将其拉为2014/10/13(这是正确的,我需要的)。

如果我将MySQL字段类型设置为textvarchar,它会以正确的顺序插入值,但当然不是ColdFusion的日期格式。因此它将日期插入为11/10/2014,但是当我将相同的字段设置为“日期”或“日期时间”格式时,它会以正确的格式插入它'2014-10-11但是上面的问题

我目前正在使用的代码是:

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

我的第二次尝试是使用以下内容:

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

然后我收到以下错误:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   '1900-01-01 00:00:00'}'附近,ScheduleReferenceNumber ='TS8279631'   ,'第15行

在第三次尝试中,我使用了:

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

但是我得到了错误:

  

此输出异常的原因是:   coldfusion.runtime.locale.CFLocaleBase $ InvalidDateTimeException:   StartDate是无效的日期或时间字符串..

还尝试过:

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

我得到以下内容:

  

执行数据库查询时出错。

     

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   ''2014-10-11 00:00:00.0'附近,货币='',Tutor ='',   CourseLoc'在第17行

2 个答案:

答案 0 :(得分:4)

您忘了指定Locale。省略时,LS日期函数使用当前页面的Locale。听起来像你的“英语(美国)”。根据美国约会惯例,月份始终是第一位的。所以字符串“11/10/2014”将始终视为11月10日,而不是10月11日。

也就是说,如果要填充日期/时间列,则应使用cfqueryparam并将日期对象传递给数据库,而不是日期字符串,这可能会被误解,具体取决于在数据库设置上。

一种选择是将LSParseDateTime()与适当的区域设置一起使用。不要使用ParseDateTime()。与大多数标准日期函数一样,它总是使用美国日期规则,并且会产生与您现在获得的相同的错误结果。

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

此外,为了验证,请务必使用IsDate的LS版本。再次使用适当的Locale。

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

NB:请记住,CF的日期函数对于被认为有效的内容是非常“慷慨”的。如果日期字符串的格式可能不同,您可能希望实现自己的日期验证。

答案 1 :(得分:1)

假设您的数据库数据类型是日期或类似的东西,您使用的是不适当的函数。 LSdateformat()将日期转换为字符串。将字符串转换为日期的函数是ParseDateTime()。

如果您的日期字段始终以相同的格式到达,则可以对函数ParseDateTime()的相应掩码参数进行硬编码。如果它们不同,您必须使用条件逻辑来确定正确的掩码。

您还应该谨慎使用isDate()。它在某些意外值上返回true,例如&#34; apr 31&#34;。将它与ReFind()和len()结合起来会更彻底。