【问题标题】:The data types time and datetime are incompatible in the equal to operator?数据类型 time 和 datetime 在 equal to 运算符中不兼容?
【发布时间】:2015-12-10 23:19:34
【问题描述】:

我尝试根据日期、开始和结束时间删除表格行后出现此错误。我使用 onClick 函数从表格行传递日期、开始和结束时间。然后我使用 Ajax 发送这些值。这是我的代码:

<cfoutput query="qryView">
    <table>
       <tr>
           <td>#dateFormat(DateSch,"mm/dd/yyyy")#</td>
           <td>#timeFormat(Stime,"hh:mm tt")#</td>
           <td>#timeFormat(Etime,"hh:mm tt")#</td>
           <td onClick="deleteDate('#dateFormat(DateSch,"mm/dd/yyyy")#','#timeFormat(Stime,"hh:mm tt")#','#timeFormat(Etime,"hh:mm tt")#')">Delete</td>
      </tr>
   </table>
</cfoutput>

<script>
    function deleteDate(DateSch,Stime,Etime){ 
        $.ajax(
        {
            type:'POST',
            url:'/AjaxFunction.cfc?method=deleteSchedule&returnformat=json',
            data:{'DateSch':DateSch,'Stime':Stime,'Etime':Etime},
            cache:false,
            success: function(data,x,xhrobj)
            {
                var Result = $.parseJSON(data);
                if($.trim(Result.STATUS) == '200'){
                    alert('Removed!');
                }else{
                    alert(Result.message); 
                }
            }
        });
    }
</script>

这是我的删除查询:

<cfquery name="qryDelete" datasource="test">
    Delete From Table
    Where DateS = <cfqueryparam cfsqltype="cf_sql_date" value="#arguments.DateSch#">
    and Start = <cfqueryparam cfsqltype="cf_sql_time" value="#arguments.Stime#">
    and End = <cfqueryparam cfsqltype="cf_sql_time" value="#arguments.Etime#">
</cfquery>

首先,当我尝试单击删除按钮时,我收到了一个类似这样的 java 脚本错误:

SyntaxError: missing ) after argument list    
deleteDate('74','{ts '2015-12-10 00:00:00'}','1970-01-01 08:00:00.0','1970-01-01...

然后我将 dateFormat 放在我传递的日期值周围,将 timeFormat 放在时间值周围。这解决了这个问题。然后在我的 Ajax 调用后出现错误:

"The data types time and datetime are incompatible in the equal to operator"

我在参数中发送的值如下所示:

DateSch 
12/10/2015
Etime   
08:25 AM
Stime   
08:00 AM

我不知道为什么会出现此错误。在我在 cfquery 中使用它们之前,我尝试在 Coldfusion 中使用 createDateTime 函数转换这些值,但这并没有帮助。有谁知道我可以如何解决这个错误/将日期时间与我的值进行比较?

【问题讨论】:

  • 嗯...您是否首先验证了 cfquery 确实有效?如果没有,请暂时跳过 ajax。先对查询进行故障排除,因为如果它不起作用,ajax肯定也不起作用。在单独的页面上测试 cfquery,其中包含一些变量和上面的示例值。结果是什么 - 同样的错误?如果是这样,请添加 A) complete 错误消息您的问题(包括行号和任何生成的 SQL)和 B) 这三列的数据类型:DateS、Start、End。 (我假设这些不是 actual 列,因为“Start”和“End”都是保留字。)。
  • 我测试了我的 cfquery,并且仅使用我通过 ajax 传递的值即可正常工作。对于日期时间,我使用示例:'2015-12-11' 有效,但这也适用于 '12/11/2015'。对于开始时间,我使用“08:00 AM”和“08:15 AM”结束时间。我在 db 中将这两列命名为 StartTime 和 EndTime。这三列的数据类型还有日期、时间(7)和时间(7)。这就是我的参数值如何发送到 cfc page value = {"ETIME":"08:15 AM","STIME":"08:00 AM","DATESCH":"2015-12-11"}跨度>
  • 我解决了这个问题。在 Where 子句中我的论点前面我使用 CONVERT() 和 Then VARCHAR。现在我的 cfquery 工作正常。
  • 如果必须强制转换,请避免使用varchar,因为这会导致隐式转换,在某些情况下会导致奇怪的结果。相反,使用与操作数左侧相同的数据类型。我很少使用 TIME 列。通常我更喜欢使用单个日期/时间列来进行更简单的查询,但可以尝试使用 TIME(..) 函数或 CAST(... AS TIME)。 但这也适用于 '12/11/2015'。 是的,CF 可以自动解析大多数日期字符串。尽管它对“认为”是日期和时间的值有相当广泛的解释,但验证日期/时间字符串通常是个好主意。
  • 仅供参考,回滚到以前的版本,因此现有的 cmets 和答案仍然有意义。随意发布您的最终代码作为“答案”。允许在 S.O. 上回答您自己的问题。

标签: mysql coldfusion


【解决方案1】:

总是发布 complete 错误消息。您发布的查询适用于 MySQL 5.6。因此,尽管有“MySQL”标签,但我强烈怀疑您实际上正在使用 SQL Server,并且完整的错误消息实际上是:

[Macromedia][SQLServer JDBC Driver][SQLServer]数据类型时间和 datetime 在 equal to 运算符中不兼容。

该错误通常是由submitting "time" values as "datetime" values 引起的。这会导致错误,因为查询最终会尝试比较苹果和橙子,即时间和日期时间。

某些 MS SQL Server 驱动程序支持通过将 sendTimeAsDateTime=false 添加到 DSN 连接属性来禁用该行为。不幸的是,这似乎不适用于核心 Adob​​e 数据库驱动程序。正如您所发现的,您将需要使用强制转换或转换。但是,不要使用varchar。这将导致隐式转换,在某些情况下会导致古怪的结果。而是使用与操作数左侧相同的数据类型,即time

<cfquery datasource="theDatasource">
    DELETE FROM TableName
    WHERE  DateSch = <cfqueryparam cfsqltype="cf_sql_date" value="#arguments.DateSch#">
    AND   STime = CAST(<cfqueryparam cfsqltype="cf_sql_time" value="#arguments.Stime#"> AS TIME) 
    AND   ETime = CAST(<cfqueryparam cfsqltype="cf_sql_time" value="#arguments.Etime#"> AS TIME)
</cfquery>

【讨论】:

    【解决方案2】:

    试试这样的:

    <cfquery name="qryDelete" datasource="test">
        Delete From Table
        Where DATEDIFF(DateS, <cfqueryparam cfsqltype="cf_sql_date" value="#arguments.DateSch#">) = 0
        and TIMEDIFF(Start, <cfqueryparam cfsqltype="cf_sql_time" value="#arguments.Stime#">) = 0
        and TIMEDIFF(End, <cfqueryparam cfsqltype="cf_sql_time" value="#arguments.Etime#">) = 0
    </cfquery>
    

    我对 ColdFusion 不熟悉,所以我不能肯定前面没有语法错误。此外,您可能必须将日期格式更改为 YYYY-MM-DD 才能让 MySQL 满意。

    【讨论】:

    • 我认为这在这种情况下不会有帮助,DateDiff 会给我一个 date1 小于 date2。
    • 您正在寻找DateS = someotherdate。使用 DATEDIFF,您可以在两个日期相同时测试 DATEDIFF(DateS, someotherdate) = 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2017-03-23
    • 1970-01-01
    • 2015-05-29
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多