mysql实现行转列作为临时表、以及字符分割行转列

1.需求:实现两个日期段转换为具体的日期天数(2022-10-23至2022-10-26得到一张2022-10-23、2022-10-24、2022-10-25、2022-10-26的临时表) 

SELECT
    DATE_FORMAT( DATE_ADD( '2022-10-23 22:00:00', INTERVAL ( help_topic_id ) DAY ), '%Y-%m-%d' ) AS days 
FROM
    mysql.help_topic 
WHERE
    help_topic_id <= TIMESTAMPDIFF(
        DAY,
    CONCAT( '2022-10-23 22:00:00' ),
    CONCAT( '2022-12-26 22:00:00' ))

help_topic本身是Mysql一个帮助解释注释表,用于解释Mysql各种专有名词,由于这张表数据ID是从0顺序增加的,方便我们用于计数,但是8.0.17版本的只有686条数据,超过这个数字,我们就需要己自定义一张表。

可以用做计数的临时表,查询的语句只会用help_topic计数,超出的部分其实都是脏数据。

help_topic 是数据库mysql的一个表,该表提供查询帮助主题给定关键字的详细内容(详细帮助信息)
表字段含义:

         help_topic_id:帮助主题详细信息在表记录中对应的ID(从0开始自增到686
        name:帮助主题给定的关键字名称。
        help_category_id:帮助主题类别ID,与help_category表中的help_category_id字段值相等。
        description:帮助主题的详细信息(这里就是我们通常查询帮助信息真正想看的内容,例如:告诉我们某某语句如何使用的语法与注意事项等)。
        example:帮助主题的示例信息(告诉我们语句如何使用的示例)。
        url:该帮助主题对应在MySQL官方在线手册中的URL链接地址。

 

#查询本周第一天
SELECT DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE()) DAY) AS TIME

#查询本周的最后一天
SELECT DATE_SUB(CURDATE(),INTERVAL WEEKDAY(CURDATE())-6 DAY) AS TIME

#查询本月的第一天
SELECT DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY) AS TIME

#查询本月的最后一天
SELECT LAST_DAY(CURDATE()) AS TIME

#当前quarter的第一天:  
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM  CURDATE()),1) + interval QUARTER(CURDATE())*3-3 month),'%Y-%m-'),'01'); 
 
#当前quarter的最后一天:  
select LAST_DAY(MAKEDATE(EXTRACT(YEAR  FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-1 month);

#当年第一天:
SELECT DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY);
 
#当年最后一天:
SELECT concat(YEAR(now()),'-12-31'); 

#新增一个星期
SELECT DATE_ADD(now(), INTERVAL 1 week) time

#新增一个月
SELECT DATE_ADD(now(), INTERVAL 1 month) time

#新增一个季度
SELECT DATE_ADD(now(), INTERVAL 1 quarter) time

#新增一年
SELECT DATE_ADD(now(), INTERVAL 1 year) time

查询本日,本周,本月,本年的数据

#查询本日的数据
SELECT T.* FROM buz_sampling_data T
WHERE TO_DAYS(TIME) = TO_DAYS(NOW())


#查询本周的数据
SELECT T.* FROM buz_sampling_data T
WHERE YEARWEEK(TIME,1) = YEARWEEK(NOW(),1)


#查询本月的数据
SELECT T.* FROM buz_sampling_data T
WHERE MONTH(TIME) = MONTH(NOW())


#查询本年的数据
SELECT T.* FROM buz_sampling_data T
WHERE YEAR(TIME) = YEAR(NOW())

 

需要将字符串(电脑IP)192.168.211.35(按照.进行拆分)


SELECT
    SUBSTRING_INDEX( SUBSTRING_INDEX( t.ip, '.', h.help_topic_id + 1 ), '.', - 1 )
FROM
    test.test t
    JOIN mysql.help_topic h ON h.help_topic_id < ( LENGTH( t.ip ) - LENGTH( REPLACE ( t.ip, '.', '' )) + 1 );

 SUBSTRING_INDEX(str,delim,count)函数

str: 要分割的字符串

delim: 分割符(比如逗号,和点.)

count: 计数(分割到第几个),正数表示从左向右数,负数表示从右向左数

LENGH函数 

LENGTH(str) 统计字符串的长度

REPLACE(str,from_str,to_str) 替换字符串

用to_str替换from_str得到最终的str

参数:

str:最终得到的字符串

from_str: 旧的字符(被替换的字符)

to_str: 新的字符

结果就是用新的字符替换旧的字符,得到的最终的字符串

SELECT REPLACE('192.168.211.35','.',''); -- 得到19216821135

SELECT LENGTH(REPLACE('192.168.211.35','.','')); -- 得到长度是11

遇到的问题
sql执行报错:SELECT command denied to user '###' for table 'help_topic'
SELECT命令拒绝用户 '###‘用于表’help_topic’

原因 :
mysql用户没有执行查询help_topic表的权限,需要root用户授权。
解决
用mysql的root账户执行 GRANT SELECT ON mysql.help_topic TO 'wp'@'localhost'(给用户授予mysql.help_topic的查询权限)
 

创建用户
方式1: CREATE USER 'wp'@'localhost' IDENTIFIED BY '123456';
方式2: GRANT USAGE ON *.* TO 'wp'@'localhost' IDENTIFIED BY '132456';
删除用户
DROP USER 'wp'@'localhost';
查询用户
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
用户授权
GRANT SELECT ON mysql.help_topic TO 'wp'@'localhost'
取消用户授权
REVOKE SELECT ON mysql.help_topic FROM 'wp'@'localhost';
查询用户授权
SHOW GRANTS FOR 'wp'@'localhost';


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL中的行转列和列转行是两种不同的数据处理方式。行转列是将一行数据转换为多列数据,而列转行则是将多列数据转换为一行数据。 行转列可以使用MySQL的group_concat函数来实现。该函数可以将同一组的行合并为一个字段,并使用指定的分隔符进行拼接。通过group_concat函数的参数可以明确指定要返回的列。分组是根据group by指定的列进行的。 列转行的实现方法有多种。其中一种方法是使用MySQL中的子查询和字符串函数。可以使用SUBSTRING_INDEX和REPLACE函数来分割和替换字符串,从而将多列数据合并为一列。这个过程需要使用到临时表和变量来生成行号,然后再根据行号进行拼接。 请注意,以上引用内容提供的是两种不同的方法,可以根据实际情况选择适合的方法进行行转列或列转行的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [sql查询:行转列和 列转行](https://blog.csdn.net/weixin_40482816/article/details/109395069)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [sql 行转列 列转行 总结](https://blog.csdn.net/cheqian2116/article/details/100719372)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值