有数据表:Car
字段:CookiesId(nvarchar(50)),数据记录如下:
20130205113721
20130208102212
20130211095407
20130212225649
20130214210708
20130215133752
......
求:时间差,需要将字符串类型转换为时间,以当前时间为准,得到8小时前的记录的方法。
这里为大家提供几种方法,可分别尝试下。
方法1:
CREATE FUNCTION dbo.fn_ConvertToDate
(
@DateStr varchar(50),
@Format varchar(50) = 'yyyy-mm-dd hh:nn:ss'
)
RETURNS DATETIME
AS
BEGIN
DECLARE @Result DATETIME
IF(@DateStr IS NULL OR LEN(@DateStr) = 0)
BEGIN
RETURN;
END
IF(@Format = 'yyyy-mm-dd hh:nn:ss')
BEGIN
GOTO LABLE_CONVERT;
END
DECLARE @Start INT,
@Length INT,
@Year varchar(4),
@Month varchar(2),
@Day varchar(2),
@Hour varchar(2),
@Miniute varchar(2),
@Sencond varchar(2)
--获取年份
SELECT @Start = CHARINDEX('yyyy',@Format);
IF(@Start > 0)
BEGIN
SET @Length = 4;
END
ELSE
BEGIN
SELECT @Start = CHARINDEX('yy',@Format);
SET @Length = 2;
END
IF(@Start > 0)
SELECT @Year = SUBSTRING(@DateStr,@Start,@Length)
--获取月份
SELECT @Start = CHARINDEX('mm',@Format);
IF(@Start > 0)
BEGIN
SET @Length = 2;
END
ELSE
BEGIN
SELECT @Start = CHARINDEX('m',@Format);
SET @Length = 1;
END
IF(@Start > 0)
SELECT @Month = SUBSTRING(@DateStr,@Start,@Length)
--获取日期
SELECT @Start = CHARINDEX('dd',@Format);
IF(@Start > 0)
BEGIN
SET @Length = 2;
END
ELSE
BEGIN
SELECT @Start = CHARINDEX('d',@Format);
SET @Length = 1;
END
IF(@Start > 0)
SELECT @Day = SUBSTRING(@DateStr,@Start,@Length)
--获取小时
SELECT @Start = CHARINDEX('hh',@Format);
IF(@Start > 0)
BEGIN
SET @Length = 2;
END
ELSE
BEGIN
SELECT @Start = CHARINDEX('h',@Format);
SET @Length = 1;
END
IF(@Start > 0)
SELECT @Hour = SUBSTRING(@DateStr,@Start,@Length)
--获取分钟
SELECT @Start = CHARINDEX('nn',@Format);
IF(@Start > 0)
BEGIN
SET @Length = 2;
END
ELSE
BEGIN
SELECT @Start = CHARINDEX('n',@Format);
SET @Length = 1;
END
IF(@Start > 0)
SELECT @Miniute = SUBSTRING(@DateStr,@Start,@Length)
--获取秒钟
SELECT @Start = CHARINDEX('ss',@Format);
IF(@Start > 0)
BEGIN
SET @Length = 2;
END
ELSE
BEGIN
SELECT @Start = CHARINDEX('s',@Format);
SET @Length = 1;
END
IF(@Start > 0)
SELECT @Sencond = SUBSTRING(@DateStr,@Start,@Length)
SET @DateStr = 'yyyy-mm-dd hh:nn:ss'
SELECT @DateStr = REPLACE(@DateStr,'yyyy',ISNULL(@Year,'1900'))
SELECT @DateStr = REPLACE(@DateStr,'mm',ISNULL(@Month,'01'))
SELECT @DateStr = REPLACE(@DateStr,'dd',ISNULL(@Day,'01'))
SELECT @DateStr = REPLACE(@DateStr,'hh',ISNULL(@Hour,'00'))
SELECT @DateStr = REPLACE(@DateStr,'nn',ISNULL(@Miniute,'00'))
SELECT @DateStr = REPLACE(@DateStr,'ss',ISNULL(@Sencond,'00'))
LABLE_CONVERT:
SELECT @Result = CAST(@DateStr AS DATETIME);
RETURN @Result;
END
GO
/* --test:
SELECT dbo.fn_ConvertToDate('20121115141552','yyyymmddhhnnss')
*/
方法2:使用字符串来处理的例子
DECLARE @a VARCHAR(30)
SET @a='20130205113721'
DECLARE @b VARCHAR(30)
SELECT SUBSTRING(@a,1,4) AS '年',SUBSTRING(@a,5,2) AS '月',SUBSTRING(@a,7,2) AS '日',SUBSTRING(@a,9,2) AS '时',SUBSTRING(@a,11,2) AS '分',SUBSTRING(@a,13,2) AS '秒'
SELECT SUBSTRING(@a,1,4)+'-'+ SUBSTRING(@a,5,2)+'-'+SUBSTRING(@a,7,2) +' '+SUBSTRING(@a,9,2) +':'+SUBSTRING(@a,11,2)+':'+SUBSTRING(@a,13,2)
SET @b= SUBSTRING(@a,1,4)+'-'+ SUBSTRING(@a,5,2)+'-'+SUBSTRING(@a,7,2) +' '+SUBSTRING(@a,9,2) +':'+SUBSTRING(@a,11,2)+':'+SUBSTRING(@a,13,2)
SELECT CAST(@b AS DATETIME)
/*
年 月 日 时 分 秒
-------- ---- ---- ---- ---- ----
2013 02 05 11 37 21
(1 行受影响)
---------------------------------
2013-02-05 11:37:21
(1 行受影响)
-----------------------
2013-02-05 11:37:21.000
(1 行受影响)
*/
-----使用以上代码的最后两行的代码来转换就可以了。
补充:
用字符串的话,要做到严格控制格式,比如统一为YYYYMMDDHHMMSS这样的格式,不能说一个数据是20130205113721,而另外一个数据是201325113721(也就是月日部分如果为一位就没有前面那个0),这样的话,你基本上无法获取正确的日期,从而导致数据转换失败。
另外,没必要用nvarchar,因为这个存储空间比varchar多一倍。而纯粹的数字不需要Unicode编码。不会出现文字方面的乱码情况。
所以建议使用varchar,如果你的日期规则控制得当,甚至使用char(14)更加高效。