【问题标题】:Date format error in ColdFusion and mySQLColdFusion 和 mySQL 中的日期格式错误
【发布时间】:2016-03-03 23:52:37
【问题描述】:

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

我的代码读取并插入所有数据,但是当它读取日期字段时,当日期低于 1​​2 时出现问题。奇怪的是它以相反的方式插入。

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

如果我将 MySQL 字段类型设置为 textvarchar,它会以正确的顺序插入值,但对于 ColdFusion,当然不是以日期格式。所以它插入一个日期为 2014 年 11 月 10 日,但是当我将相同的字段设置为输入“日期”甚至“日期时间”格式时,它会以正确的格式“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' 附近,货币 = '',导师 = '', 第 17 行的 CourseLoc'

【问题讨论】:

  • 嗨,我尝试了几种不同的方法,根据提到的重复错误,但我使用 CreateODBCDate 或 cfqueryparam,它返回错误“日期”是无效的日期或时间字符串。但它不是,因为上面的方法确实有效并带来了日期
  • 确保调试已打开。然后使用产生该错误的 sql 以及参数的值来编辑您的问题。
  • 您是否有特定原因必须使用循环来构造查询?就个人而言,我尽可能避免使用这种方法,因为与任何动态 sql 一样,它更难“正确”执行,也更难调试。这可能是您的一些错误的原因。其他是由于不正确地使用日期函数。 (例如,ParseDateTime 没有“掩码”参数,日期 objects 不应括在引号中,...)

标签: mysql coldfusion coldfusion-9


【解决方案1】:

您忘记指定Locale。省略时,LS 日期函数使用当前页面的区域设置。听起来你的是“英语(美国)”。根据美国日期惯例,月份始终是第一位的。因此字符串“11/10/2014”将总是被视为 11 月 10 日,而不是 10 月 11 日。

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

一种选择是将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 版本。再次使用适当的语言环境。

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

注意:请记住,CF 的日期函数对于被认为有效的内容是出了名的“慷慨”。如果您的日期字符串的格式可以变化,您可能需要实现自己的日期验证。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • ParseDateTime 不适用于 dd-mm-yyyy 日期字符串,因为它始终使用美国日期约定。相反,您必须使用 LS 日期函数。不过同意其他观点。
    • 这个,,返回 {ts '2014-06-15 00:00:00'}。 ParseDateTime 以何种方式不适用于 dd-mm-yyyy?我什至忘记指定掩码。当我添加一个时,我得到了相同的结果。
    • 大多数(如果不是全部)非 LS 日期函数使用美国日期规则,因此 they will not handle dd-mm-yyyy date strings correctly。将字符串更改为不明确的值,如“05-06-2014”,结果将为“{ts '2014-05-06 00:00:00'}”。
    • (编辑)更正:ParseDateTime 不接受 CF9(OP 版本)中的掩码。 CF10+支持。
    • 另一件事我不知道。在版本 9,0,1,274733 中, 返回 {ts '2014-01-06 00:00: 00'}。
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多