之前从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.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.
select convert(datetime,'8/18/2005 6:41:38 PM')
3.2007/4/26 下午 05:20:39各位再帮忙想想看
我也去看看能不能写进去的时候避免这种格式
这种格式是现在新增的
按这样的方法
可以解决
3.2007/4/26 下午 05:20:39
但是在对付其他的如
1.8/18/2005 6:41:38 PM
2.10/2/2001
时会出错只能分开处理。当然分开不是不可以,我在修改一部分代码就好。
但是如果可以一次搞定就更好了^_^
不知道有谁可以一次搞定,对付所有的情况
是不是SQL Server 上的标准时间格式里就没有这一种?
但是VB里直接取now就是这样的格式阿
/*
--实现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',' ')
即可上面那几种都测试通过
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'后转换为日期,比较的时候也就不用管时间的正确性了。小弟再次感谢各位高人帮忙!!!