【mysql】 操作 收集持续更新

查询指定天数的数据(查询7天前状态等于2的数据)

SELECT * FROM table where DATE_SUB(DATE_FORMAT(CURDATE(),"%Y-%m-%d"), INTERVAL 7 DAY) >= DATE_FORMAT(F_CreatorTime,"%Y-%m-%d") and F_Status=2 order by F_CreatorTime  desc;

日期加减天数

MySQL 为日期增加一个时间间隔:date_add()

now()       //now函数为获取当前时间

select date_add(now(), interval 1 day); - 加1天

select date_add(now(), interval 1 hour); -加1小时

select date_add(now(), interval 1 minute); - 加1分钟

select date_add(now(), interval 1 second); -加1秒

select date_add(now(), interval 1 microsecond);-加1毫秒

select date_add(now(), interval 1 week);-加1周

select date_add(now(), interval 1 month);-加1月

select date_add(now(), interval 1 quarter);-加1季

select date_add(now(), interval 1 year);-加1年

MySQL adddate(), addtime()函数,可以用date_add() 来替代。

2. MySQL 为日期减去一个时间间隔:date_sub()

MySQL date_sub() 日期时间函数 和date_add() 用法一致。

MySQL 中subdate(),subtime()函数,建议,用date_sub()来替代。

中文按首字母排序(不区分多音字)

select Id,`Name` from Area  where `Level`= 4  order by convert(`Name` using gbk) asc

mysql表名区分大小写

windows下修改my.ini,配置如下

[mysqld]
lower_case_table_names=2

注:Linux为0

一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据

GROUP_CONCAT(Name SEPARATOR ',')

需注意:

1.GROUP_CONCAT()中的值为你要合并的数据的字段名;

 SEPARATOR 函数是用来分隔这些要合并的数据的;

 ' '中是你要用哪个符号来分隔;

2.必须要用GROUP BY 语句来进行分组管理,不然所有的数据都会被合并成一条记录

根据经纬度计算两点间的距离

CREATE  FUNCTION `fnGetDistance`(`longitude1` DECIMAL(10,7),`latitude1` DECIMAL(10,7),`longitude2` DECIMAL(10,7),`latitude2` DECIMAL(10,7)) RETURNS bigint(20)
BEGIN
    DECLARE Distance REAL DEFAULT 0;
        SET Distance = ROUND(6378.137*2*ASIN(SQRT(POW(SIN((latitude1*PI()/180-latitude2*PI()/180)/2),2)+COS(latitude1*PI()/180)*COS(latitude2*PI()/180)*POW(SIN((longitude1*PI()/180-longitude2*PI()/180)/2),2)))*1000);
        RETURN Distance; 
END

 

修改使用子查询赋值

update `Menu` set ParentId=(select p.id from (SELECT id from `Menu` where MenuName='业务') p) where MenuName='视频';

使用连接查询修改数据

UPDATE personal_settlement s JOIN sysdept c ON s.DeptId = c.Id SET s.DeptName=c.`Name`  where s.DeptId=9;

模糊搜索 常用的一共有4个方法,如下

1. 使用locate()方法

        1.1.普通用法:

              SELECT `column` from `table` where locate('keyword', `condition`)>0

         类似于 java 的 indexOf();不过 locate() 只要找到返回的结果都大于0(即使是查询的内容就是最开始部分),没有查找到才返回0;

        1.2. 指定其实位置:

               SELECT LOCATE('bar', 'foobarbar',5);  --> 7 (从foobarbar的第五个位置开始查找)

2.使用instr()函数 (据说是locate()的别名函数)

       SELECT `column` from `table` where instr(`condition`, ‘keyword’ )>0

       唯一不同的是 查询内容的位置不同,见SQL语句中过的keyword

3.使用position()方法,(据说也是locate()方法的别名函数,功能一样) 

         SELECT `column` from `table` where position(‘keyword’ IN `condition`)

         不过它不再是通过返回值来判断,而是使用关键字 in

4.使用find_in_set()函数

       如: find_in_set(str,strlist),strlist必须要是以逗号分隔的字符串

    如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N

SQL> SELECT FIND_IN_SET('b','a,b,c,d'); +---------------------------------------------------------+ | SELECT FIND_IN_SET('b','a,b,c,d') | +---------------------------------------------------------+ | 2 | +---------------------------------------------------------+ 1 row in set (0.00 sec)

总结: locate、position 和 instr 的差別只是参数的位置不同,同时locate 多一个起始位置的参数外,两者是一样的。

         find_in_set()是个比较特殊的存在,但它们都是返回要查找的子字符串 在 指定字符串中的位置。

         速度上前3个比用 like 稍快了一点。(不过这四个函数都不能使用索引,这是个遗憾)

 

出现中文乱码解决:

修改my.ini文件,添加如下配置

[client]
default-character-set=utf8

[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci

中文乱码参考:http://www.cnblogs.com/songdada119/p/5923219.html

添加数据库报错:[Err] 1366 - Incorrect string value: '\xE4\xBB\x8E\xE5\x85\xA5...' for column 'name' at row 1,这样因为添加数据中存在中文

解决:检查当前字段字符集格式

posted @ 2017-03-10 10:03  ice.ko  阅读(285)  评论(0编辑  收藏  举报