Sql server 2012 为什么此查询转换为datetime中断,而不是另一个查询?

Sql server 2012 为什么此查询转换为datetime中断,而不是另一个查询?,sql-server-2012,Sql Server 2012,此查询工作正常: select CONVERT(DATETIME, GroupAdminEffectiveDate, 101) from ExchangeSmallGroupEnrollment group by GroupAdminEffectiveDate 并返回以下内容: 1900-01-01 00:00:00.000 2012-06-30 00:00:00.000 2012-07-01 00:00:00.000 2012-07-11 00:00:00.000 2012-07-23 00

此查询工作正常:

select CONVERT(DATETIME, GroupAdminEffectiveDate, 101) from ExchangeSmallGroupEnrollment
group by GroupAdminEffectiveDate
并返回以下内容:

1900-01-01 00:00:00.000
2012-06-30 00:00:00.000
2012-07-01 00:00:00.000
2012-07-11 00:00:00.000
2012-07-23 00:00:00.000
2012-07-25 00:00:00.000
2012-08-01 00:00:00.000
2012-08-14 00:00:00.000
2012-08-26 00:00:00.000
2012-09-01 00:00:00.000
2012-09-03 00:00:00.000
但是,以下查询:

select CONVERT(DATETIME, GroupAdminEffectiveDate, 101) from ExchangeSmallGroupEnrollment
我从错误中得到以下信息:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.
有什么想法吗?非常感谢

更新:

查询:

select distinct GroupAdminEffectiveDate from ExchangeSmallGroupEnrollment
结果:

(empty string)
06/30/2012
07/01/2012
07/11/2012
07/23/2012
07/25/2012
08/01/2012
08/14/2012
08/26/2012
09/01/2012
09/03/2012
选中此项:

select CONVERT(DATETIME, ISDATE( GroupAdminEffectiveDate), 101) from ExchangeSmallGroupEnrollment

我无法重现您的错误,因此我怀疑我们对“空字符串”的定义不同,或者您没有透露其他一些情况。同时,由于您使用的是SQL Server 2012,因此可以为此使用
TRY\u PARSE
,例如以下表达式之一:

SELECT TRY_PARSE(GroupAdminEffectiveDate AS DATETIME USING N'en-us') 
  FROM dbo.ExchangeSmallGroupEnrollment;

SELECT TRY_PARSE(GroupAdminEffectiveDate AS DATETIME USING N'en-us') 
  FROM dbo.ExchangeSmallGroupEnrollment
  GROUP BY GroupAdminEffectiveDate;

SELECT TRY_PARSE(GroupAdminEffectiveDate AS DATETIME USING N'en-us') 
  FROM dbo.ExchangeSmallGroupEnrollment
  GROUP BY TRY_PARSE(GroupAdminEffectiveDate AS DATETIME USING N'en-us');
如果确实希望1900-01-01为有效输出,则:

SELECT COALESCE(TRY_PARSE(GroupAdminEffectiveDate AS DATETIME USING N'en-us'),
    '19000101') 
  FROM dbo.ExchangeSmallGroupEnrollment
  GROUP BY TRY_PARSE(GroupAdminEffectiveDate AS DATETIME USING N'en-us');

您的数据库中可能有更多的“非日期”字段。一个可以是
,另一个可以是
。当您按或不同分组时,所有结果都是
,这意味着空值,这有利于转换。 否则,
(空格)将失败

选中ExchangeSmallGroupEnrollment中的
选择长度(GroupAdminEffectiveDate)

也许它会给你一些线索?

你首先将
varchar
列转换为
Datetime
,然后转换

Declare @testvarchar VARCHAR(15) = '08/27/2012'
select CONVERT(datetime, Cast(@testvarchar as datetime), 101)

这将解决您的转换错误

GroupAdminEffectiveDate的类型是什么?GroupAdminEffectiveDate的数据类型是什么?为什么不是约会或约会时间?这是一个VARCHAR。。。不幸的是,我无法控制的系统将其存储为VARCHAR。请将您的视图定义添加到问题中。如果您可以为两个查询添加执行计划,这也会很有帮助。问题很可能是您得到了不同的执行计划,并且表中的日期值无效,并且在失败的查询中筛选出错误的日期行之前执行转换。这应该做什么?它只是将0或1转换为日期。。。。1900-01-01 00:00:00.000或1900-01-02 00:00:00.000仍然不确定为什么查询不起作用,但这将满足我的需要