之前从ACCESS的数据库导入到了SQL,将原来的date/time转为了现在的nverchar。栏位中存在多种格式的日期数据,如下
1.8/18/2005 6:41:38 PM
2.10/2/2001
3.2007/4/26 下午 05:20:39
4.9/5/2006 3:02:51 AM
5.12/12/2006 3:02:51 AM现在的要用到的SQL语句如下:
select * from csilogset where ctime between '2007/03/01' and '2006/04/30' 本来想法是将ctime转为字符取出前10位,再转为日期,再转为需要的格式的字符。
语法如下:
select CONVERT(varchar(10),CONVERT(datetime, CONVERT(varchar(10),ctime ,120),120),111)

select CONVERT(varchar(10),CONVERT(datetime, left(ctime ,10),120),111)但是这时才发现了提到的类型中的第4种,如果取到第10位就错了,如果只要前9位又会无法应付第5种。实在是没有办法了,上来求助!!
高手帮帮忙啊!!PS:实在不行可以考虑对数据库update.

解决方案 »

  1.   


    select convert(datetime,'8/18/2005 6:41:38 PM')
      

  2.   

    select convert(datetime,ctime )
      

  3.   

    select isdate('8/18/2005 6:41:38 PM')   --返回1代表是日期,0不是select convert(char(10),convert(datetime,'8/18/2005 6:41:38 PM'),111)
      

  4.   

    用ISDATE(列名)来判断是否符合格式就好了~
      

  5.   

    select convert(char(10),convert(datetime,'8/18/2005 6:41:38 PM'),111)这样子对付不了
    3.2007/4/26 下午 05:20:39各位再帮忙想想看
    我也去看看能不能写进去的时候避免这种格式
    这种格式是现在新增的
      

  6.   

    select cast(replace('2007/4/26 下午 05:20:39','下午','')+'PM' as datetime)
      

  7.   

    select cast(replace(ctime,'下午','')+'PM' as datetime) as ctime
      

  8.   

    select cast(replace('2007/4/26 下午 05:20:39','下午','')+'PM' as datetime)
     
    按这样的方法
    可以解决 
    3.2007/4/26 下午 05:20:39
    但是在对付其他的如
    1.8/18/2005 6:41:38 PM
    2.10/2/2001
    时会出错只能分开处理。当然分开不是不可以,我在修改一部分代码就好。
    但是如果可以一次搞定就更好了^_^
    不知道有谁可以一次搞定,对付所有的情况
      

  9.   

    select case when charindex('下午','2007/4/26 下午 05:20:39')>0 then cast(replace('2007/4/26 下午 05:20:39','下午','')+'PM' as datetime) else cast('2007/4/26 下午 05:20:39' as datetime) end
      

  10.   

    select cast(case when charindex('下午',ctime)>0 then replace(ctime,'下午','')+'PM' else ctime end as datetime) as ctime
      

  11.   

    请问这样的格式'2007/4/26 下午 05:20:39'是不是没有办法被直接读取为时间或转为datetime格式的?
    是不是SQL Server 上的标准时间格式里就没有这一种?
    但是VB里直接取now就是这样的格式阿
      

  12.   

    可以写个通用函数,获取年月日部分,再转成需要格式
    /*
    --实现split 功能 的函数
    --Author :sp4
    */
    CREATE   function dbo.Pqs_split(@SourceStr varchar(8000),@SeprateStr varchar(10))
    returns @table table(col varchar(100))
    as 
    begin
    declare @table_tmp table(ident int identity(1,1),tempvalue char(1))
    insert into @table_tmp(tempvalue) select    top 100 '' from syscolumns a,syscolumns b
    if @SeprateStr=' '  --空格单独处理,否则有错误
    begin
    select @SourceStr=Replace(@SourceStr,@SeprateStr,'|' ),@SeprateStr='|'
    end
    insert into @table
    select substring(@SourceStr,pqs.ident,charindex(@SeprateStr,@SourceStr+@SeprateStr,pqs.ident)-pqs.ident)   from @table_tmp pqs
    where substring(@SeprateStr+@SourceStr,pqs.ident,1)=@SeprateStr return 
    end--------------------------
    declare @date varchar(20)
    select top 1 convert(varchar(10),cast(col as datetime),120) from Pqs_split('8/18/2005 6:41:38 PM',' ') 
    即可上面那几种都测试通过
      

  13.   

    因为还发现有
    2007/4/26 PM 05:20:39
    这样格式的其实最主要的目的是取出日期部分进行比较,又要尽量避免修改数据库,又要尽量简短辛苦大家了,最后写出来的是这样的
    select * from csilogset where  cast(case when charindex('午',ctime)>0 then replace(replace(ctime,'上午',''),'下午','') else replace(replace(ctime,'AM',''),'PM','')  end as datetime) >= '2006/06/01' 
    直接去掉'上午','下午','AM','PM'后转换为日期,比较的时候也就不用管时间的正确性了。小弟再次感谢各位高人帮忙!!!