Coldfusion ParseDateTime不会为SQL Server日期时间查询输出ODBC文本

Coldfusion ParseDateTime不会为SQL Server日期时间查询输出ODBC文本,coldfusion,Coldfusion,设置ColdFusion 2021后,我发现当使用ParseDateTime从SQL Server格式化日期时间值时,它不会像ColdFusion 2016那样将日期格式化为ODBC文本,例如{ts'2021-05-15 13:20:51'}。相反,它只是从数据库输出未更改的值 这是我的环境: Coldfusion 2016 Server: Version: 2016,0,17,325979 Tomcat Version: 8.5.61.0 Edition: Developer Opera

设置ColdFusion 2021后,我发现当使用ParseDateTime从SQL Server格式化日期时间值时,它不会像ColdFusion 2016那样将日期格式化为ODBC文本,例如{ts'2021-05-15 13:20:51'}。相反,它只是从数据库输出未更改的值

这是我的环境:

Coldfusion 2016 Server:
Version: 2016,0,17,325979 
Tomcat Version: 8.5.61.0
Edition: Developer  
Operating System: Windows 7

Coldfusion 2021 Server:
Version: 2021,0,01,325996
Tomcat Version: 9.0.41.0
Edition: Developer  
Operating System: Windows 10
数据库是SQL Server 2008 R2,ColdFusion数据源使用MS SQL Server驱动程序

一个示例查询:

<cfquery name="qryDates">
    select id, expiry_date
    from purchases
</cfquery>

<cfoutput>#ParseDateTime(qryDates.expiry_date)#</cfoutput>
Coldfusion 2016输出:

{ts'2021-05-15 13:20:51'}

Coldfusion 2021输出:

2021-05-1513:20:51.0

有没有办法让ParseDateTime像在我的CF 2016和我过去使用过的所有其他CF服务器上那样运行?我不希望必须更改格式才能完成此操作,例如DateTimeFormatPasseDateTimeQRydates.Expiration\u date


谢谢您的建议。

我现在没有任何方法来测试我的假设,但我假设您看到了ParseDateTime处理Java对象的方式的副作用,以及CF2016和CF2021/18之间该函数的差异

由于expriry_date是数据库中的实际日期时间对象,因此数据库中的cfquery将为您提供一个sql对象,而不仅仅是一个看起来像日期的字符串。由于它同时具有日期和时间组件,我相信JDBC将向CF发送一个java.sql.Timestamp对象


ParseDateTime的目的是将字符串转换为日期对象,尽管它可以格式化日期对象,但这并不是它的目的。它的初始假设是给定了一个字符串,因为CF是动态类型的,所以它通常会尝试隐式地将值转换为正确的类型。由于数据库值是date ish,CF将尝试使其看起来像一个字符串。至少这是它的工作方式。ParseDateTime用于将字符串解析为日期对象,而不是格式化日期的输出。你能详细说明为什么需要时间吗?根据名称,它听起来像是某种日期/时间列,在这种情况下,它已经包含一个日期对象。如果您确实需要odbc格式,可以尝试使用createODBCDateTime,但请再次尝试。。我不确定它是否真的需要。同意@SOS。ParseDateTime用于处理日期的字符串表示形式。如果过期日期是数据库中的字符串,而不是日期类型的对象,则需要重构数据库。以字符串形式显示日期是处理日期的可怕方式。@Shawn Expiration\u date实际上是一个SQL datetime字段。听起来查询没有使用cfqueryparam。幸运的是,非参数化查询的工作时间与它们一样长,因为实现返回了一个odbc格式的字符串。现在Adobe已经改变了这一点,旧方法将不再有效。因此,您需要更改代码。理想情况下,通过在所有查询中使用cfqueryparam,可以提高应用程序的安全性和性能。根据传输的内容,也可以使用select直接插入。虽然它应该也可以工作,但用CreateODBCDateTime替换ParseDateTime是最不可取的选项。@DMcG-对于传递到sql字符串中的任何原始值,安全性都可能是一个问题。数值更容易破解,但我也不会说日期字符串是100%安全的。也就是说,cfqueryparam的主要功能实际上不是安全性,尽管它有很大的好处。绑定变量的主要用途是提高查询性能。继续注意,toString代码需要一个行号。否则,将得到列对象的字符串表示形式,而不是第1行中的值。
<cfscript>
    /*** CREATE QUERY OBJECT ***/
    theDateQuery = QueryNew("dt","timestamp",[{"dt":createODBCDateTime('2021-04-09 12:01:02.345')}]) ;
    writeDump(theDateQuery);
    
    /*** SET QUERY RESULT TO A VARIABLE ***/
    dobj = theDateQuery.dt[1] ;
    writeOutput("dobj: " & dobj & " ("& getMetadata(dobj).getName() & ")<br>");
    
    /*** CONVERT QUERY VARIABLE TO A STRING ***/
    dstr = theDateQuery.dt[1].toString() ;
    writeOutput("dstr: " & dstr & " ("& getMetadata(dstr).getName() & ")<br>");
    
    /*** PARSEDATETIME OF OBJECT ***/
    x = parseDateTime(dobj) ;
    writeOutput("x: " & x & " ("& getMetadata(x).getName() & ")<br>");
    
    /*** PARSEDATETIME OF STRING ***/
    y = parseDateTime(dstr) ;
    writeOutput("y: " & y & " ("& getMetadata(y).getName() & ")<br>");
</cfscript>
ParseDateTime(qryDates.expiry_date.toString())