mysql 计算两个日期之间的工作日天数

2019-12-11  本文已影响0人  jiezzy

创建透视表t500
建表

CREATE TABLE `t500` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=501 DEFAULT CHARSET=latin1;
插入500条数据
CREATE DEFINER=`json`@`%` PROCEDURE `i500`()
BEGIN 
 DECLARE a INT default 1;
 while a<=500 do
 insert into t500 (id) value(a);
 set a=a+1;
 end while;
 end

2.1

select t500.id from t500 where t500.id <=DATEDIFF("2019-02-01","2019-01-01")+1

2.2

SELECT
    DATE_ADD(
    STR_TO_DATE( "2019-01-01", '%Y-%m-%d' ),
    INTERVAL t500.id - 1 DAY 
    ) 
FROM
    t500 
WHERE
    t500.id <= DATEDIFF( "2019-02-01", "2019-01-01" ) +1

2.3

SELECT
    DATE_FORMAT(
    DATE_ADD(
    STR_TO_DATE( "2019-01-01", '%Y-%m-%d' ),
    INTERVAL t500.id - 1 DAY 
    ),
    '%a' 
    ) 
FROM
    t500 
WHERE
    t500.id <= DATEDIFF( "2019-02-01", "2019-01-01" ) +1

2.4

    SELECT
CASE
    
WHEN
    DATE_FORMAT(
    DATE_ADD(
STR_TO_DATE( "2019-01-01", '%Y-%m-%d' ),
    INTERVAL t500.id - 1 DAY 
    ),
    '%a' 
    ) IN ( 'Sat', 'Sun' ) THEN
        0 ELSE 1 end 
    FROM
        t500 
WHERE
t500.id <= DATEDIFF( "2019-02-01", "2019-01-01" ) +1

2.5 最终SQL

select sum(CASE
    
WHEN
    DATE_FORMAT(
    DATE_ADD(
STR_TO_DATE( "2019-01-01", '%Y-%m-%d' ),
    INTERVAL t500.id - 1 DAY 
    ),
    '%a' 
    ) IN ( 'Sat', 'Sun' ) THEN
        0 ELSE 1 end ) as days from 
        t500 
WHERE
t500.id <= DATEDIFF( "2019-02-01", "2019-01-01" ) +1

https://my.oschina.net/u/3238650/blog/3019543
https://my.oschina.net/u/3238650/blog/3020350

mysql 分组行号查询

SELECT 
    @row_number:=CASE
        WHEN @customer_no = customerNumber THEN @row_number + 1
        ELSE 1
    END AS num,
    @customer_no:=customerNumber as CustomerNumber,
    paymentDate,
    amount
FROM
    payments,(SELECT @customer_no:=0,@row_number:=0) as t
ORDER BY customerNumber;


---
SET @row_number = 0;
 
SELECT 
    (@row_number:=@row_number + 1) AS num, firstName, lastName
FROM
    employees
LIMIT 5;



---
SELECT 
    (@row_number:=@row_number + 1) AS num, firstName, lastName
FROM
    employees,(SELECT @row_number:=0) AS t
LIMIT 5;

SQL查询存在一个表而不在另一个表中的数据

方法1
使用 not in ,容易理解,效率低

select distinct A.ID from  A where A.ID not in (select ID from B)
方法2
使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录

select A.ID from A left join B on A.ID=B.ID where B.ID is null
方法3
逻辑相对复杂,但是速度最快

select * from  B where (select count(1) as num from A where A.ID = B.ID) = 0
SELECT a.`name`,b.week_day,b.good_id from t_mall_activity a
INNER JOIN t_mall_activity_second_kill b on a.id = b.activity_id
where now() >= a.start_date  and now() < date_add(a.stop_date, interval 1 day)
and a.`enable`=1 and b.`enable` = 1 and (b.week_day = DATE_FORMAT(now(), '%w') or (b.week_day = 7 and DATE_FORMAT(now(), '%w') = 0))

SELECT sum(case when d.week_day = (case DATE_FORMAT( DATE_ADD(STR_TO_DATE( t.start_date, '%Y-%m-%d' ),INTERVAL a.id - 1 DAY ),'%w' )
        when 0 then 7 
        else DATE_FORMAT( DATE_ADD(STR_TO_DATE( t.start_date, '%Y-%m-%d' ),INTERVAL a.id - 1 DAY ),'%w' ) 
    end) then 1 else 0 end) as days
 from t_380 a
INNER JOIN t_mall_activity t on TRUE
INNER JOIN t_mall_activity_second_kill d on d.activity_id = t.id
where a.id <= DATEDIFF( t.stop_date , t.start_date ) +1
and d.id = 1




SELECT * from
(
    SELECT * from
    (
    SELECT a.`name`,b.id, b.good_id,b.week_day,
        b.title,b.limit_count,b.stock_count,
        subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7) date, b.start_time,b.kill_time,
        str_to_date(CONCAT(subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7),b.start_time),'%Y-%m-%d%H:%i:%s') begin_time,
        date_add(str_to_date(CONCAT(subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7),b.start_time),'%Y-%m-%d%H:%i:%s'),interval b.kill_time minute) end_time,
        b.price,b.member_price from t_mall_activity a
        INNER JOIN t_mall_activity_second_kill b on a.id = b.activity_id
        where now() >= a.start_date  and now() < date_add(a.stop_date, interval 1 day)
        and a.`enable`=1 and b.`enable` = 1
        and subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7) >= a.start_date
        and subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7) < date_add(a.stop_date, interval 1 day)
    UNION all

    SELECT a.`name`,b.id, b.good_id,b.week_day,
        b.title,b.limit_count,b.stock_count,
        subdate(curdate(),date_format(curdate(),'%w') - b.week_day) date, b.start_time,b.kill_time,
        str_to_date(CONCAT(subdate(curdate(),date_format(curdate(),'%w') - b.week_day),b.start_time),'%Y-%m-%d%H:%i:%s') begin_time,
        date_add(str_to_date(CONCAT(subdate(curdate(),date_format(curdate(),'%w') - b.week_day),b.start_time),'%Y-%m-%d%H:%i:%s'),interval b.kill_time minute) end_time,
        b.price,b.member_price from t_mall_activity a
        INNER JOIN t_mall_activity_second_kill b on a.id = b.activity_id
        where now() >= a.start_date  and now() < date_add(a.stop_date, interval 1 day)
        and a.`enable`=1 and b.`enable` = 1
        and subdate(curdate(),date_format(curdate(),'%w') - b.week_day) >= a.start_date
        and subdate(curdate(),date_format(curdate(),'%w') - b.week_day) < date_add(a.stop_date, interval 1 day)
        ) t where t.date < DATE_FORMAT(NOW(), '%Y-%m-%d') ORDER BY date desc LIMIT 1
)t1
UNION
SELECT * from
(
SELECT a.`name`,b.id, b.good_id,b.week_day,
        b.title,b.limit_count,b.stock_count,
        subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7) date, b.start_time,b.kill_time,
        str_to_date(CONCAT(subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7),b.start_time),'%Y-%m-%d%H:%i:%s') begin_time,
        date_add(str_to_date(CONCAT(subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7),b.start_time),'%Y-%m-%d%H:%i:%s'),interval b.kill_time minute) end_time,
        b.price,b.member_price from t_mall_activity a
        INNER JOIN t_mall_activity_second_kill b on a.id = b.activity_id
        where now() >= a.start_date  and now() < date_add(a.stop_date, interval 1 day)
        and a.`enable`=1 and b.`enable` = 1
        and subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7) >= a.start_date
        and subdate(curdate(),date_format(curdate(),'%w') - b.week_day+7) < date_add(a.stop_date, interval 1 day)
    UNION all
    SELECT a.`name`,b.id, b.good_id,b.week_day,
        b.title,b.limit_count,b.stock_count,
        subdate(curdate(),date_format(curdate(),'%w') - b.week_day) date, b.start_time,b.kill_time,
        str_to_date(CONCAT(subdate(curdate(),date_format(curdate(),'%w') - b.week_day),b.start_time),'%Y-%m-%d%H:%i:%s') begin_time,
        date_add(str_to_date(CONCAT(subdate(curdate(),date_format(curdate(),'%w') - b.week_day),b.start_time),'%Y-%m-%d%H:%i:%s'),interval b.kill_time minute) end_time,
        b.price,b.member_price from t_mall_activity a
        INNER JOIN t_mall_activity_second_kill b on a.id = b.activity_id
        where now() >= a.start_date  and now() < date_add(a.stop_date, interval 1 day)
        and a.`enable`=1 and b.`enable` = 1
        and subdate(curdate(),date_format(curdate(),'%w') - b.week_day) >= a.start_date
        and subdate(curdate(),date_format(curdate(),'%w') - b.week_day) < date_add(a.stop_date, interval 1 day)
) t2 where t2.date >= DATE_FORMAT(NOW(), '%Y-%m-%d') ;
上一篇下一篇

猜你喜欢

热点阅读