【问题标题】:CFSpreadsheet Date formatting issueCFSpreadsheet 日期格式问题
【发布时间】:2013-09-04 19:26:05
【问题描述】:

我在本地运行 ColdFusion 10,但最近从 Oracle 转换为 MSSQL 的数据库遇到了两个问题。

我要做的是使用 cfspreadsheet 将数据库中的数据输出到电子表格中。表中有 3 列,其中包含日期/时间戳。

问题 #1:代码在转换之前运行良好,但在转换之后,所有日期/时间戳都以科学记数法格式显示。我尝试使用强制转换修改我的 CFQUERY,但这只是将日期/时间戳字段显示为“YYYY/MM/DD”,而不是我的预期格式“MM/DD/YYYY HH:MM AM/PM” 。当我双击 excel 中的单元格时,我看到了正确的格式,但默认情况下它显示为“YYYY/MM/DD”。这里有什么建议吗?

问题 #2:如果应该使用我指定的日期/时间格式的列或特定单元格为空或 null,我会收到一个 '' is an invalid date or time string 错误。

这是我在 cfquery 中用于 CAST/CONVERT 的内容:

            ,CAST(CONVERT(varchar(20), GYMSTARTDATE, 22) AS datetime) AS GymStartDateTime
        ,CAST(CONVERT(varchar(20), GYMENDDATE, 22) AS datetime) AS GymEndDateTime

【问题讨论】:

  • 1) 我不是在讽刺,但是……如果它“运行良好”,你想改变什么? :) 2) 一些电子表格功能是.. 古怪的。如果您将一个小型的、独立的复制案例放在一起来演示该问题,这将有所帮助,这样我们就可以独立测试它。对 sql 部分使用 sqlfiddle.com。 3) 如果您遇到错误,请包含 full 错误消息。从这句话很难判断你是遇到 SQL 错误还是 CF 错误。
  • “在转换之前工作正常”是指当它是 Oracle 时,ColdFusion 输出正确显示的电子表格文件上的日期字段。也就是说,Oracle 到 MSSQL 的转换完成后,所有的日期字段都以科学计数形式出现。因此,我在 CFQUERY 中添加了“CAST(CONVERT.....”),它所做的唯一一件事就是将 Excel 文件中的科学记数法格式更改为 YYYY/MM/DD 格式。

标签: excel sql-server-2008 datetime coldfusion cfspreadsheet


【解决方案1】:

如果没有看到数据示例和您的实际代码,很难说。但是,我尝试使用 CF10 和 SQL Server 2005 重现您描述的问题,但无法重现。所有值都显示为字符串,而不是科学计数法。

听起来您的数据或环境中有一些我们不知道的不同之处。请整理一个重现问题的小例子,我们可以进一步调试。

测试 1:

<!--- raw dates --->
<cfquery name="qry" datasource="#dsn#">
    SELECT  StartDate, EndDate
    FROM    YourTable
</cfquery>

<cfspreadsheet action="write" 
      filename="c:/test.xls" 
      query="qry" 
      overwrite="true" /> 

结果 1:(细胞类型:常规)

STARTDATE                   ENDDATE
2013-08-20 14:19:28.907     2013-09-03 14:19:28.907
2013-08-25 14:19:30.293     2013-09-03 02:19:30.293

测试 2:

<!--- convert / datetime --->
<cfquery name="qry" datasource="#dsn#">
SELECT CAST(CONVERT(varchar(20), StartDate, 22) AS datetime) AS GymStartDateTime
          , CAST(CONVERT(varchar(20), EndDate, 22) AS datetime) AS GymEndDateTime
FROM   YourTable
</cfquery>

<cfspreadsheet action="write" 
      filename="c:/test2.xls" 
      query="qry"  
      overwrite="true" /> 

结果 2:(细胞类型:常规)

GYMSTARTDATETIME            GYMENDDATETIME
2013-08-20 14:19:28.0       2013-09-03 14:19:28.0
2013-08-25 14:19:30.0       2013-09-03 02:19:30.0

测试 3:

<!--- convert / string --->
<cfquery name="qry" datasource="#dsn#">
SELECT  CONVERT(varchar(20), StartDate, 22) AS GymStartDateTime
           , CONVERT(varchar(20), EndDate, 22) AS GymEndDateTime
FROM   YourTable
</cfquery>

<cfspreadsheet action="write" 
      filename="c:/test3.xls" 
      query="qry" 
      overwrite="true" /> 

结果 3:(细胞类型:常规)

GYMSTARTDATETIME            GYMENDDATETIME
08/20/13  2:19:28 PM        09/03/13  2:19:28 PM
08/25/13  2:19:30 PM        09/03/13  2:19:30 AM

【讨论】:

    【解决方案2】:

    如果你弄明白了,请告诉我。这是我在 2011 年提供的示例代码的链接。它不适用于 ColdFusion 9 或 10。我还列出了所有官方“内置”(但不支持)日期格式。

    http://pastebin.com/aQnembR3

    <cfset q = queryNew("Name,Date", "varchar,date")>
    <cfloop index="x" from="1" to="10">
        <cfset queryAddRow(q)>
        <cfset querySetCell(q, "Name", "Name #x#")>
        <cfset querySetCell(q, "Date", now())>
    </cfloop>
    
    <cfset dfStyle = {dataformat = "m/d/yy h:mm"}>
    
    <cfset o = spreadsheetNew('dateTest', true)>
    <cfset spreadsheetAddRows(o, q)>
    <cfset spreadsheetFormatColumn(o, dfStyle, 2)>
    
    <cfset bin = spreadsheetReadBinary(o)>
    
    <cfheader name="Content-Disposition" value="attachment; filename=dateTest_#dateFormat(now(), 'ddmmmyyyy')#.xlsx">
    <cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" variable="#bin#" reset="true">
    

    【讨论】:

    • 什么版本的CF10?在使用 CF10(未打补丁)的快速测试中,它对我来说效果很好。
    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多