我已经设置了一个从一个数据库读取xml文件并将该数据插入另一个数据库的文件。一切正常,除了日期格式的奇怪错误。我需要的日期格式为yyyy-mm-dd
。但是,原始数据设置为格式dd-mm-yyyy
。
我的代码读取并插入所有数据,但是当它读取日期字段时,当一天不到12时就会出现问题。奇怪的是,它会以相反的方式插入。
11/10/2014
,则会将其拉为2014/11/10
13/10/2014
,则会将其拉为2014/10/13
(这是正确的,我需要的)。如果我将MySQL字段类型设置为text
或varchar
,它会以正确的顺序插入值,但当然不是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行
答案 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()结合起来会更彻底。