当前位置:  数据库>sqlserver

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

    来源: 互联网  发布时间:2014-08-29

    本文导语:  有数据表:Car 字段:CookiesId(nvarchar(50)),数据记录如下: 20130205113721 20130208102212 20130211095407 20130212225649 20130214210708 20130215133752 ...... 求:时间差,需要将字符串类型转换为时间,以当前时间为准,得到8小时前的记录的方...

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


    
 
 

您可能感兴趣的文章:

  • 怎么把字符串转为:unicode 编码?又如何把unicode编码转为字符串(有中文)?
  • java的applet中是否有将一个字符串转为对象处理?如:"Label1"转为Label?
  • 怎么在kenel模块编程里将数值形转为字符串型?
  • 在c#中把字符串转为变量名并获取变量值的小例子
  • 求教:如何将中文字符串转为unicode码!!!!
  • mysql查询字符串替换语句小结(数据库字符串替换)
  • Oracle中SQL语句连接字符串的符号使用介绍
  • 谁用过ejb 进行模糊查询???语句怎么写???能实现根据中间的字符串进行模糊查找么?
  • 用SQL语句实现替换字符串
  • sqlserver中遍历字符串的sql语句
  • 在线求一个改变字符串的shell语句
  • sqlserver中求字符串中汉字的个数的sql语句
  • SQLServer中字符串左对齐或右对齐显示的sql语句
  • SQL语句 一个简单的字符串分割函数
  • sqlserver 字符串分拆 语句
  • sqlserver中去除字符串中连续的分隔符的sql语句
  • 用sql获取某字符串中的数字部分的语句
  • mysql替换表中的字符串的sql语句
  • MSSQL批量替换语句 在SQL SERVER中批量替换字符串的方法
  • shell基础学习中的字符串操作、for循环语句示例
  • mysql中取字符串中的数字的语句
  • MySQL replace函数替换字符串语句的用法
  • mysql like查询字符串示例语句
  • Oracle to_char 日期转换字符串语句分享
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Strings(字符串) 成员 size():返回字符串中字符的数量
  • 关于字符串的操作,我想得到字符串的长度,和他开始两位组成的新的字符串,例如::
  • C++ Strings(字符串) 成员 c_str():将字符串以C字符数组的形式返回
  • 如何使GDB显示完整的字符串变量,当字符串比较长时。
  • C++ Strings(字符串) 成员 empty():如果字符串为空,返回真
  • php判断字符串在另一个字符串位置的方法
  • C++ Strings(字符串) 成员 length():返回字符串的长度
  • 请教,有关16进制字符串形成2进制字符串的问题!
  • C++ Strings(字符串) 成员 resize():重新设置字符串的大小
  • shell程序:在大文件中查找特定字符串,但该字符串可以跨行
  • C++ Strings(字符串) 成员 Operators:操作符,用于字符串比较和赋值
  • 怎样判断一个字符串在另一个字符串里面?
  • C++ Strings(字符串) 成员 reserve():保留一定容量以容纳字符串(设置capacity值)
  • 请问怎样从键盘读入一个字符串,怎样连接两个字符串,谢谢
  • C++ Strings(字符串) 成员 swap():交换两个字符串的内容
  • 浅析string类字符串和C风格字符串之间的区别
  • C++ Strings(字符串) 成员 find():在字符串中查找字符
  • 如何用shell实现将指定文件中的指定的字符串替换为我指定的另外的字符串
  • C++ Strings(字符串) 成员 substr():返回某个子字符串
  • 如何将一个双引号”放在一个字符串中,就是在字符串中如何转义一个双引号。谢谢!
  • C++ Strings(字符串) 成员 end():返回一个迭代器,指向字符串的末尾。(最后一个字符的下一个位置)
  • C语言实现输入一个字符串后打印出该字符串中字符的所有排列


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3