SQL2005 varchar时间类型 怎么相减 得到分钟数。

沙漠的驼铃 2013-11-06 11:18:43
有一个表,有两列 varchar类型的时间,长度是varchar(12)。这两列 怎么相减得到分钟数。

sql 有什么可以把字符类型时间 装为 datetime类型的语句嘛。
...全文
507 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2013-11-07
  • 打赏
  • 举报
回复
你这种情况,还是专门写一个标量函数比较好, 毕竟经常要用的 ……
IF OBJECT_ID('fn_split12charToDate') IS NOT NULL
BEGIN
	DROP FUNCTION dbo.fn_split12charToDate
END
GO
-- =============================================
-- Author:		yenange
-- Create date: 2013-11-7
-- Description:	将 '201310101232' 类似的字符串转换成datetime类型
-- =============================================
CREATE FUNCTION dbo.fn_split12charToDate
(
	@dateStr VARCHAR(12)
)
RETURNS DATETIME
AS
BEGIN
	DECLARE @str VARCHAR(MAX)
	SET @str = STUFF(STUFF(STUFF(STUFF(@dateStr, 5, 0, '-'),8,0,'-'),11,0,' '),14,0,':')
	RETURN CAST(@str AS DATETIME);
END
GO

--测试代码
DECLARE @d1 VARCHAR(12),@d2 VARCHAR(12);
SELECT @d1 = '201310101232', @d2 = '201310101331';
--DATEDIFF(datepart,startdate,enddate) / 分钟	mi, n  / http://www.w3school.com.cn/sql/func_datediff.asp
SELECT DATEDIFF(n, dbo.fn_split12charToDate(@d1), dbo.fn_split12charToDate(@d2))
/* 结果: 59 */ 
  • 打赏
  • 举报
回复
是直接存储的: 10:20:35 是存储的这种吗 因为varchar(12) 不可能存储下 '2013-11-06 10:20:35'。 所以,这样试试:

declare @t1 varchar(12)
declare @t2 varchar(12)

set @t1 = '10:20:35'
set @t2 = '10:35:35'


--@t2减去@t1
select datediff(minute,'1990-01-01 '+@t1,'1990-01-01 '+@t2) 
/*
15
*/
  • 打赏
  • 举报
回复
引用 楼主 u012458591 的回复:
有一个表,有两列 varchar类型的时间,长度是varchar(12)。这两列 怎么相减得到分钟数。 sql 有什么可以把字符类型时间 装为 datetime类型的语句嘛。
你的varchar(12) 不太可能存储的是日期-时间吧,是直接存储的时间吗?
唐诗三百首 2013-11-06
  • 打赏
  • 举报
回复

-- 这两列 相减得到分钟数。
select [字段1],
       [字段2],
       datediff(mi,cast([字段1] as datetime),cast([字段2] as datetime)) '分钟数'
 from [表名]

-- 把字符类型时间 装为 datetime类型的语句
select cast([字段名] as datetime)
 from [表名]
--小F-- 2013-11-06
  • 打赏
  • 举报
回复
转换成DATETIME可以这样 CAST(COL AS DATETIME)
發糞塗牆 2013-11-06
  • 打赏
  • 举报
回复
你的数据如果是yyyy-mm-dd hh:mm:ss的话,应该可以用 select datediff(mi,第一个日期,第二个日期)来计算分钟差
大人物小孩子 2013-11-06
  • 打赏
  • 举报
回复
,今天我也遇到了相同的问题
唐诗三百首 2013-11-06
  • 打赏
  • 举报
回复

declare @x1 varchar(12),@x2 varchar(12)

select @x1='201310101232',@x2='201310101331'

select datediff(mi,
cast(left(@x1,4)+'-'+substring(@x1,5,2)+'-'+substring(@x1,7,2)+' '+substring(@x1,9,2)+':'+substring(@x1,11,2)+':00' as datetime),
cast(left(@x2,4)+'-'+substring(@x2,5,2)+'-'+substring(@x2,7,2)+' '+substring(@x2,9,2)+':'+substring(@x2,11,2)+':00' as datetime)) '分钟数'

/*
分钟数
-----------
59

(1 row(s) affected)
*/
發糞塗牆 2013-11-06
  • 打赏
  • 举报
回复
DECLARE @a VARCHAR(12)
DECLARE @b VARCHAR(12)
SET @a='201310101232'
SET @b='201310101233'
DECLARE @c VARCHAR(30)
DECLARE @d VARCHAR(30)
SELECT @c=CONVERT(VARCHAR(30),SUBSTRING(@a,1,4)+'-'+SUBSTRING(@a,5,2)+'-'+SUBSTRING(@a,7,2)+' '+SUBSTRING(@a,9,2)+':'+SUBSTRING (@a,11,2)+':'+'00.000',121)
SELECT @d=CONVERT(VARCHAR(30),SUBSTRING(@b,1,4)+'-'+SUBSTRING(@b,5,2)+'-'+SUBSTRING(@b,7,2)+' '+SUBSTRING(@b,9,2)+':'+SUBSTRING (@b,11,2)+':'+'00.000',121)
SELECT DATEDIFF(mi,@c,@d) AS '分钟差'
/*
SELECT CONVERT(VARCHAR(30),SUBSTRING(@a,1,4)+'-'+SUBSTRING(@a,5,2)+'-'+SUBSTRING(@a,7,2)+' '+SUBSTRING(@a,9,2)+':'+SUBSTRING (@a,11,2)+':'+'00.000',121)
*/
沙漠的驼铃 2013-11-06
  • 打赏
  • 举报
回复
因为有12位,精确到了分钟,所以转换不成功,只能转换到日期。我想做的 就是想得到两个varchar字符串时间相减的结果。
沙漠的驼铃 2013-11-06
  • 打赏
  • 举报
回复
各位亲啊 ,我的时间类型是这样的 ,201310101232。我以为大家都能明白的。

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧