sqlserver和join条件

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不可以

你可能感兴趣的:(sqlserver和join条件)