代码之家  ›  专栏  ›  技术社区  ›  Timothy Strimple

SQL Server 2008将varchar转换为datetime

  •  2
  • Timothy Strimple  · 技术社区  · 14 年前

    我遇到了一个问题,将一个表中的VARCHAR转换为DATETIME,然后将其用于比较。所有记录的格式('2010-09-02 10:38:31.000')似乎都是正确的,我可以毫无问题地选择数据。但是,如果尝试在WHERE子句中使用新的date time,则会出现错误:从字符串转换日期和/或时间时转换失败。

    所以说清楚一点,这是有效的:

    SELECT Field1, Field2, CAST(Field3 AS DATETIME) AS DateTaken FROM MyTable;
    

    SELECT Field1, Field2 FROM MyTable WHERE CAST(Field3 AS DATETIME) > @startDate;
    

    我试图使用视图来检索数据,但它也有同样的错误。接下来我试着为数据创建一个临时表,比如。。。

    SELECT Field1, Field2, CAST(Field3 AS DATETIME) AS Field3 INTO _MyTable;
    SELECT Field1, Field2 FROM _MyTable WHERE Field3 > @startDate;
    

    成功运作。

    3 回复  |  直到 14 年前
        1
  •  2
  •   clyc    14 年前

    编辑3。。。。。。。。。。。。。。

      select * from test 
      where case isdate(field3) when 1 
            then CAST(field3 as datetime) else null end > @startdate
    

    编辑2。。。。。。。。。。。。。。

    declare @startdate datetime
    
    select @startdate = '09/1/2010'
    
    Create table test (field1 varchar(50), field2 varchar(50), field3 varchar(50))
    
    
    insert into test
    select 'test' as field1, 'test' as field2, '2010-09-02 10:38:31.000' as field3
    
    insert into test
    select 'test2' as field1, 'test2' as field2, '2010-09-02 10:38:31.000' as field3
    
    insert into test
    select 'test3' as field1, 'test3' as field2, '2010-10-02 10:38:31.000' as field3
    
    select * from test where CAST(field3 as datetime) > @startdate
    
    select * from test where Convert(datetime, field3) > @startdate
    
    drop table test
    

    结果:

    test    test    2010-09-02 10:38:31.000
    test2   test2   2010-09-02 10:38:31.000
    test3   test3   2010-10-02 10:38:31.000
    
    
    test    test    2010-09-02 10:38:31.000
    test2   test2   2010-09-02 10:38:31.000
    test3   test3   2010-10-02 10:38:31.000
    

    将startdate参数更改为10/1/2010 结果:

    test3   test3   2010-10-02 10:38:31.000
    
    test3   test3   2010-10-02 10:38:31.000
    

    第一次响应。。。。。。。。。。。。。。。。。

    SELECT Field1, Field2 FROM MyTable WHERE CONVERT(DateTime, Field3) > @startdate;
    
        2
  •  1
  •   Pavel Urbančík    14 年前

    考虑使用 SET DATEFORMAT ymd

        3
  •  0
  •   Joe L.    14 年前

          select * from myTable where isdate(FIELD3)=0