• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

查询某时间段内的日期但是日期字段是varchar型

黉酃 电子科技大学 学生  2014-01-07 10:57:52
在表A中查询出字段‘a_time’在某时间断内的数据,

但是‘a_time’为varchar类型,并且数据形式参差不齐



select a_time  from A where a_time between '2012-1-01'and '2012-3-05' order by convert(datetime,a_time) desc


这样查出的结果如下:


也想过直接字符串中取出数字然后拼接比较。


IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULL
DROP FUNCTION DBO.GET_NUMBER2
GO
CREATE FUNCTION DBO.GET_NUMBER2(@S VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE PATINDEX('%[^0-9]%',@S) > 0
BEGIN
set @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')
END
RETURN @S
END
GO

PRINT DBO.GET_NUMBER2()

不会遍历去取

有什么好的方法吗?
...全文
159 点赞 收藏 5
写回复
5 条回复
我在这儿等你 2014年01月09日
根据你的日期类型,分别列出查询条件
回复 点赞
taotie1225 2014年01月08日
引用 3 楼 DBA_Huangzj 的回复:
isdate()是判断是否能转换成日期类型的函数,但是有些varchar是可以转换的,所以不一定有用。

--这种是不能转换日期型的
DECLARE @a VARCHAR(20)
SET @a='2013年1月8日'
SELECT ISDATE(@a)

/*
-----------
0

*/
如果你的存放结构只有上面两种,那么可以: select a_time from a where isdate(a_time)=1 union all SELECT RTRIM(REPLACE(REPLACE(REPLACE(a_time ,'年','-'),'月','-'),'日','')) from a where isdate(a_time)=0 这样处理,如果有多种类型,就多次union all 但是建议对插入、update进行check约束,保证数据格式的一致性
周全
回复 点赞
發糞塗牆 2014年01月08日
isdate()是判断是否能转换成日期类型的函数,但是有些varchar是可以转换的,所以不一定有用。

--这种是不能转换日期型的
DECLARE @a VARCHAR(20)
SET @a='2013年1月8日'
SELECT ISDATE(@a)

/*
-----------
0

*/
如果你的存放结构只有上面两种,那么可以: select a_time from a where isdate(a_time)=1 union all SELECT RTRIM(REPLACE(REPLACE(REPLACE(a_time ,'年','-'),'月','-'),'日','')) from a where isdate(a_time)=0 这样处理,如果有多种类型,就多次union all 但是建议对插入、update进行check约束,保证数据格式的一致性
回复 点赞
taotie1225 2014年01月07日
有个判断是否为日期的函数
回复 点赞
Zemo 2014年01月07日
不懂,学习一下
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告