sqlserver日期类函数
DATEADD 在指定的日期上增加一段时间,并返回新的日期
DATEDIFF 计算两个日期之剑的差值
DATEPART 返回指定日期的部分日期整数(比如返回日期的年)
DATENAME 返回指定日期的部分日期字符串(比如返回日期的星期字符串)
语法
DATEADD( date-part, number, date-expression )
DATEDIFF ( date-part, date-expression-1, date-expression-2 )
DATEPART ( date-part, date-expression)
DATENAME ( date-part, date-expression)
date-part的取值:
year | quarter(季度) | month | week | day | hour | minute | second | millisecond
参数
- date-part 指定操作的时间单位
- number 添加时间的数量
- date-expression 计算的日期
- date-expression-1 计算差值的起始日期
- date-expression-2 计算差值的结束日期
注意事项:当计算两个日期之间的差值时,结果如果是不足时间单位
的部分将被舍弃
SELECT datediff( day,'2020/03/10 00:00','2020/03/13 23:59' ) -- 返回3: 10、11、12
以上函数经常用在以下SQL中
示例
-- 查询今天的数据 day可以换成date-part的任意一个值 今年 当前月 过去一小时 ...
SELECT * FROM tableName where DATEDIFF(day, dateColumn, GETDATE()) = 0;
-- 查询过去3天的数据(查询某个时间段的数据)
SELECT * FROM tableName where dateColumn between dateadd(day, -3, getdate()) and getdate()
-- 获取日期的月数 返回2 和 1
SELECT DATEPART(month, '2020-02-23')
SELECT DATEPART(weekday, '2020-02-23')
-- 返回 '02' 和 '星期日' 1-星期日 .... 7-星期六
SELECT DATENAME(month, '2020-02-23')
SELECT DATENAME(weekday, '2020-02-23')
日期的格式转换
CONVERT(data_type(length), data_to_be_converted, style)
data_type(length) 规定目标数据类型(带有可选的长度)
data_to_be_converted 含有需要转换的值
style 规定日期/时间的输出格式。
常用的格式如下:
Style Id | Style 格式 |
---|---|
20 | yyyy-mm-dd hh:mi:ss(24h) |
108 | hh:mm:ss |
111 | yy/mm/dd |
112 | yymmdd |
120 | yyyy-mm |
-- 2020-03-04 16:09:22
SELECT CONVERT(VARCHAR(19), GETDATE(),20)
mysql日期类函数
日期转换函数
- FROM_UNIXTIME(timestamp, format) 时间戳转日期
- UNIX_TIMESTAMP(date) 日期转时间戳
-- date可以是一个DATE、DATETIME、TIMESTAMP格式的字符串或者是YYMMDD或YYYYMMDD格式的一个数字
SELECT UNIX_TIMESTAMP('2020-02-12')
SELECT UNIX_TIMESTAMP(20200212)
-- 2020-02-12 => 1581436800
SELECT FROM_UNIXTIME(1581436800, "%Y%m%d")
-- 查询今天的数据
select * from tableName where to_days(时间字段) = to_days(now());
-- 查询本周的数据
select * from tableName where yearweek(date_format(时间字段,'%Y-%m-%d')) = yearweek(now())
-- 查询本年的数据
select * from tableName where year(时间字段名)=year(now());
日期计算函数
- DATE_ADD(date, INTERVAL value type) 在date的基础增加或者减少日期(value为负值就减少)
- DATE_SUB(date, INTERVAL value type)
- ADDTIME(date, add_date)
- DATEDIFF(date1, date2) 日期差值
- TIMEDIFF(time1, time2) 时间差值
-- 2020-04-12
SELECT DATE_ADD('2020-02-12', INTERVAL 2 MONTH)
-- 2019-12-12
SELECT DATE_ADD('2020-02-12', INTERVAL -2 MONTH)
-- 结果 2020-02-13 00:00:00
SELECT ADDTIME('2020-02-12 23:59:59','0:1:1')
SELECT datediff('2008-08-08', '20080801');
SELECT timediff('08:08:08', '00:00:00');
join查询时and条件位置对结果的影响
-- 以下两条join查询的区别
select t1.*,t2.* from t1 inner join t2 on t1.id = t2.id and t2.name = 'mike'
select t1.*,t2.* from t1 inner join t2 on t1.id = t2.id where t2.name = 'mike'
-- 再看一下left join
select t1.*,t2.* from t1 left join t2 on t1.id = t2.id and t2.name = 'mike'
select t1.*,t2.* from t1 left join t2 on t1.id = t2.id where t2.name = 'mike'
测试脚本
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `t2` (
`a` varchar(16) NOT NULL,
`name` varchar(16) DEFAULT NULL,
`id` int(8) DEFAULT NULL,
PRIMARY KEY (`a`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test`.`t1`(`id`, `name`) VALUES (1, '1');
INSERT INTO `test`.`t1`(`id`, `name`) VALUES (3, '2');
INSERT INTO `test`.`t1`(`id`, `name`) VALUES (5, '4');
INSERT INTO `test`.`t1`(`id`, `name`) VALUES (4, '5');
INSERT INTO `test`.`t2`(`a`, `name`, `id`) VALUES ('1', 'mike', 21);
INSERT INTO `test`.`t2`(`a`, `name`, `id`) VALUES ('2', 'mike', 1);
INSERT INTO `test`.`t2`(`a`, `name`, `id`) VALUES ('3', 'mike', 4);
INSERT INTO `test`.`t2`(`a`, `name`, `id`) VALUES ('4', 'tom', NULL);
INSERT INTO `test`.`t2`(`a`, `name`, `id`) VALUES ('6', 'tom', 5);
结果:对于inner join 两条SQL语句没有任何区别,但是对于left join会存在两次查询条目不一致的情况。
原因:在进行左连接的时候,会以左边的数据为准,如果在t2表中没有对应的数据,会以NULL值代替,此时在LEFT JOIN后面的AND并无法限制这些为NULL的数据行,因为这些NULL的数据行并不存在与t2表中
但是在where条件后的and是对join出的整个结果集进行过滤,因此可以过滤掉join出来的NULL行
总结:
join后面的and会在join的时候发挥作用,where后面的条件在join完成之后发挥作用。
因此在内连接的时候可以将相关的条件写在内连接之后,减少JOIN的数据。
在左连接或者右连接时必须要考虑条件的位置
MySQL的最大和最小
- 一个表里最多可有1017列(在MySQL 5.6.9 之前最大支持1000列),虚拟列也受限这个限制
- 一个表最多可以有64个二级索引
- 联合索引最多支持16列
MySQL与sqlServer的having区别
SELECT * from sys_user HAVING user_id = '1'
SELECT user_id from sys_user HAVING user_id = '1'
在MySQL中可以直接把having当作where使用,而sqlserver不可以