求把字符串转为时间,得到8小时前的记录的sql语句

发布时间:2020-09-13编辑:脚本学堂
求把字符串转为时间,得到8小时前的记录的sql语句。有数据表:Car
字段:CookiesId(nvarchar(50)),数据记录如下:

有数据表: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)更加高效。