无法从字符串转换为smalldatetime值

时间:2009-06-22 10:13:59

标签: c# sql

这是我的陈述Exception

  

无法从字符串转换为smalldatetime值

如何解决或写出正确的陈述?

da = new SqlDataAdapter("SELECT name,[build-id],exitTime,enterTime,tagType FROM Employees,GateLogging WHERE GateLogging.tagType='Employee' AND enterTime=DATEDIFF(minute,GateLogging.enterTime,GETDATE())>10", MyConn);

3 个答案:

答案 0 :(得分:2)

WHERE子句中,删除DATEDIFF(minute,GateLogging.enterTime,GETDATE())>10语句周围的单引号。

修改

您还将datetime字段与我称之为布尔值的字段进行比较。删除enterTime=。您的陈述应如下所示:

da = new SqlDataAdapter("SELECT name,[build-id],exitTime,enterTime,tagType FROM Employees,GateLogging WHERE GateLogging.tagType='Employee' AND DATEDIFF(minute,GateLogging.enterTime,GETDATE())>10", MyConn);

编辑2

您的表定义如下:

tagID bigint
enterTime nchar(10) 
exitTime nchar(10) 
date nchar(10) 

当然,enterTime无法使用DATEDIFF,因为它不是DATETIME

问题:为什么要将日期和时间存储为NCHAR(10)而不是DATETIME?这不是好风格!

解决方案1:将enterTimeexitTime更改为DATETIME,您就可以了。

解决方案2:更改您的陈述,以便将enterTime转换为有效的DATETIME。我假设enterTime仅包含一天中的时间,因此您必须在转换前混合日期部分。

编辑3

假设date以[{1}}格式存储当天,而yyyymmddenterTime格式存储时间,您将能够汇编hh:mm:ss

DATETIME

所以你上面的陈述看起来像是:

CONVERT(DATETIME, SUBSTRING(date, 1, 4) + '-' + SUBSTRING(date, 5, 2) + '-' + SUBSTRING(date, 7,2) + ' ' + entryTime, 102)

如果存储在数据库字段中的日期/时间格式不同,则必须相应地调整da = new SqlDataAdapter( "SELECT name,[build-id],exitTime,enterTime,tagType FROM Employees,GateLogging WHERE GateLogging.tagType='Employee' AND DATEDIFF(minute,CONVERT(DATETIME, SUBSTRING(date, 1, 4) + '-' + SUBSTRING(date, 5, 2) + '-' + SUBSTRING(date, 7,2) + ' ' + entryTime, 102),GETDATE())>10", MyConn); 中的SUBSTRING语句。

答案 1 :(得分:1)

首先你把DATEDIFF的东西放在引号(')中并将它与enterTime进行比较,我怀疑它是smalldatetime类型,所以你得到了错误。正确的SQL将是:

  SELECT name,[build-id],exitTime,enterTime,tagType 
  FROM Employees,
  GateLogging 
  WHERE 
      GateLogging.tagType='Employee'
  AND
      enterTime = DATEDIFF(minute,GateLogging.enterTime,GETDATE())

至于你的> 10我认为你不应该将它与enterTime进行比较,而是使用它来代替:

    SELECT name,[build-id],exitTime,enterTime,tagType
    FROM Employees,
    GateLogging 
    WHERE 
    GateLogging.tagType='Employee'
    AND
    DATEDIFF(minute,GateLogging.enterTime,GETDATE()) >10

答案 2 :(得分:0)

我也不认为你没有使用ANSI风格的连接语法 - 这可能会在以后的生活中引起一些问题。