目录


文章目录

  • 目录
  • SQL操作日期、时间语句
  • SQL操作日期
  • 查询今天昨天
  • 查询今天
  • 查询昨天
  • 查询未来过去n天
  • 查询未来第n天的数据
  • 查询过去第n天的数据
  • 查询未来n天内(不包含第n天)所有数据(包含今天(查询当天)数据)
  • 查询未来n天内(不包含第n天)所有数据(不包含今天(查询当天)数据)
  • 查询未来n天内(包含第n天)所有数据(包含今天(查询当天)数据)
  • 查询未来n天内(包含第n天)所有数据(不包含今天(查询当天)数据)
  • 查询过去n天内(不包含第n天)所有数据(包含今天(查询当天)数据)
  • 查询过去n天内(不包含第n天)所有数据(不包含今天(查询当天)数据)
  • 查询过去n天内(包含第n天)所有数据(包含今天(查询当天)数据)
  • 查询未来n天内(包含第n天)所有数据(不包含今天(查询当天)数据)
  • 查询近n天/年数据(今天(查询当天)前n天后n天)
  • 查询近n天内所有数据
  • 查询近10年内所有数据量(根据年份划分)(前10年后10年)
  • 查询近12个月内所有数据(根据月份)(前12个月后12个月)
  • 注:近n天、月、年 这种则会查询 前n 后n
  • 查询本周、本月、本年数据
  • 查询本周数据
  • 查询本月数据
  • 查询今年数据
  • 查询某年数据
  • 查询今年12个月每月有多少数据(1-12)
  • 查询过去10年(包含今年)
  • 查询过去十二个月(包含本月份)
  • 例子
  • ORACLE 中查询过去某些月份的数据
  • ORACLE中查询本年1-12个月的数据
  • ORACLE中查询本年1-12个月的数据(纵向)
  • ORACLE 查询本年(1-12)月份,每个月份一共有多少数据(纵向)
  • 以上两种ORACLE 查询本年(1-12)个月份数据都是展示为纵向,改为横向只需将 `IN` 以及后方数据删除即可
  • 查询今年每个月有多少条数据
  • 查询今年每个季度有多少条数据
  • 查询上周、上月、上年数据(都是精确到某一周、月、年)
  • 查询上周数据
  • 查询上月数据
  • 查询上年数据
  • 查询上年今天的数据(去年今天)
  • 查询上年每个月都多少条数据
  • 查询上年每个季度都有多少天数据
  • 查询前n年、月、周、天记录(包含从查询日期到第n年内的)
  • 查询前n年、月、周 都是 前 n 到现在查询的时间这个时间段中的数据的数量
  • 查询过去10年的数据数量(包含今年)
  • 查询未来10年的数据数量(包含今年)
  • ORACLE 查询近N年的数据
  • 查询6个月前的数据(包含当前月)
  • 查询近7天数据
  • 查询过去7天数据
  • 查询季度
  • 查询本季度有多少条记录
  • 上年每个季度共有多少条记录
  • 今年每个季度共有多少条记录
  • 上个季度的数据
  • SQL操作时间语句
  • 查询当前时间
  • 查询前一小时时间
  • 查询前一小时内的数据
  • 查询当前时间之后的所有数据
  • 查询当前时间前一小时之后的所有数据
  • 查询今天每个小时内数据总量
  • 查询今天每半小时数据的总量
  • 查询今天(精确到小时)之后(未来时间)的所有数据
  • SQL操作年、月、周、等第一条、最后一条数据
  • 查询某年第一条、最后一条数据
  • 查询某月第一条数据和最后一条数据
  • 查询某周第一条数据和最后一条数据
  • 查询某个指定月份的第一条数据和最后一条数据
  • Oracle 查询某个月份的第一条数据和最后一条数据
  • 对于 group by
  • 关于 时间 转化 等问题
  • 前端传值后端接收 打印或者 bebug 显示 时间为 2023-05-16T19:09:03.000Z 转成 年月日 时分秒
  • 前端传值后端接收 打印或者 bebug 显示 时间为 Wed May 17 03:09:03 CST 2023 转成 年月日 时分秒



SQL操作日期、时间语句

SQL操作日期

查询今天昨天

查询今天
SELECT * FROM 表名 WHERE TO_DAYS( 时间字段名 ) = TO_DAYS(NOW());
SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())=0
查询昨天
SELECT * FROM 表名 WHERE TO_DAYS( NOW() ) - TO_DAYS( 时间字段名 ) = 1
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() )=-1

查询未来过去n天

查询未来第n天的数据
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) = n
查询过去第n天的数据
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) = -n
查询未来n天内(不包含第n天)所有数据(包含今天(查询当天)数据)
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) < n AND DATEDIFF( 字段 , NOW() ) >= 0
查询未来n天内(不包含第n天)所有数据(不包含今天(查询当天)数据)
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) < n AND DATEDIFF( 字段 , NOW() ) > 0
查询未来n天内(包含第n天)所有数据(包含今天(查询当天)数据)
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) <= n AND DATEDIFF( 字段 , NOW() ) >= 0
查询未来n天内(包含第n天)所有数据(不包含今天(查询当天)数据)
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) <= n AND DATEDIFF( 字段 , NOW() ) > 0
查询过去n天内(不包含第n天)所有数据(包含今天(查询当天)数据)
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) <= 0 AND DATEDIFF( 字段 , NOW() ) > -n
查询过去n天内(不包含第n天)所有数据(不包含今天(查询当天)数据)
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) < 0 AND DATEDIFF( 字段 , NOW() ) > -n
查询过去n天内(包含第n天)所有数据(包含今天(查询当天)数据)
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) <= 0 AND DATEDIFF( 字段 , NOW() ) >= -n
查询未来n天内(包含第n天)所有数据(不包含今天(查询当天)数据)
SELECT * FROM 表名 WHERE DATEDIFF( 字段 , NOW() ) < 0 AND DATEDIFF( 字段 , NOW() ) >= -n

查询近n天/年数据(今天(查询当天)前n天后n天)

查询近n天内所有数据
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL n DAY) <= date( 时间字段名 )
查询近10年内所有数据量(根据年份划分)(前10年后10年)
SELECT YEAR ( 时间字段名 ) AS m, count( id ) AS number, 
-- 保留两位小数
cast( sum( 金额字段名 ) AS DECIMAL ( 10, 2 )) AS mon 
FROM 表名 WHERE YEAR ( 时间字段名 )> YEAR ( now() ) - 10 GROUP BY YEAR ( 时间字段名 )
查询近12个月内所有数据(根据月份)(前12个月后12个月)
SELECT DATE_FORMAT( 时间字段名, '%Y-%m' ) AS cm, COUNT( id ) AS cn, cast( sum ( 金额字段名 ) AS DECIMAL ( 10, 2 ) ) AS mon FROM 表名 WHERE date_sub( curdate(), INTERVAL 12 MONTH ) <= date( 时间字段名 ) GROUP BY cm
注:近n天、月、年 这种则会查询 前n 后n

查询本周、本月、本年数据

查询本周数据
SELECT * FROM 表名 WHERE YEARWEEK(date_format( 时间字段名 ,'%Y-%m-%d')) = YEARWEEK(now());
查询本月数据
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名 ,'%Y-%m') = DATE_FORMAT(now(),'%Y-%m')
select * FROM 表名 WHERE DATE_FORMAT( 时间字段名 ,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m')
查询今年数据
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名 , '%Y' ) = DATE_FORMAT( SYSDATE(), '%Y' )
-- MySQL 语法
SELECT * FROM table_name WHERE YEAR(date_field) = 2024;
查询某年数据
SELECT * FROM 表名 WHERE YEAR(时间字段名) = 某年;
查询今年12个月每月有多少数据(1-12)
SELECT
	concat(( SELECT YEAR ( now())), '-01' ) AS '月份' UNION
SELECT
	concat(( SELECT YEAR ( now())), '-02' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-03' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-04' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-05' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-06' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-07' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-08' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-09' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-10' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-11' ) UNION
SELECT
	concat(( SELECT YEAR ( now())), '-12')
查询过去10年(包含今年)
select * from 
        (
        SELECT
        DATE_FORMAT( CURDATE(), '%Y' ) AS everyy UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 1 YEAR ), '%Y' ) AS everyy UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 2 YEAR ), '%Y' ) AS everyy UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 3 YEAR ), '%Y' ) AS everyy UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 4 YEAR ), '%Y' ) AS everyy UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 5 YEAR ), '%Y' ) AS everyy UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 6 YEAR ), '%Y' ) AS everyy UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 7 YEAR ), '%Y' ) AS everyy UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 8 YEAR ), '%Y' ) AS everyy UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 9 YEAR ), '%Y' ) AS everyy
        ) AS years
查询过去十二个月(包含本月份)
SELECT *
         FROM
        (
        SELECT
        DATE_FORMAT( CURDATE(), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 1 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 2 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 3 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 4 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 5 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 6 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 7 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 8 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 9 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 10 MONTH ), '%Y-%m' ) AS everym UNION
        SELECT
        DATE_FORMAT(( CURDATE() - INTERVAL 11 MONTH ), '%Y-%m' ) AS everym
        ) AS months

例子

SELECT
	* 
FROM
	(
	SELECT
		DATE_FORMAT( CURDATE(), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 1 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 2 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 3 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 4 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 5 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 6 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 7 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 8 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 9 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 10 MONTH ), '%Y-%m' ) AS everym UNION
	SELECT
		DATE_FORMAT(( CURDATE() - INTERVAL 11 MONTH ), '%Y-%m' ) AS everym 
	) AS months
	LEFT JOIN ( SELECT * FROM a ) AS shows ON months.everym = shows.time
ORACLE 中查询过去某些月份的数据
SELECT to_char( SYSDATE, 'yyyy-MM' ) AS yaerMonth FROM dual
UNION
SELECT to_char( SYSDATE - INTERVAL '1' MONTH, 'yyyy-MM' ) AS yaerMonth FROM dual 
UNION
SELECT to_char( SYSDATE - INTERVAL '2' MONTH, 'yyyy-MM' ) AS yaerMonth FROM dual 
UNION
SELECT to_char( SYSDATE - INTERVAL '3' MONTH, 'yyyy-MM' ) AS yaerMonth FROM dual 

结果:
2022-07
2022-08
2022-09
2022-10
ORACLE中查询本年1-12个月的数据
SELECT
	mon.yaerMonth,
	one.a 
FROM
	(
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-01' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-02' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-03' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-04' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-05' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-06' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-07' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-08' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-09' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-10' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-11' ) AS yaerMonth 
	FROM
		dual UNION
	SELECT
		CONCAT( to_char( SYSDATE, 'yyyy' ), '-12' ) AS yaerMonth 
	FROM
		dual 
	) mon
	LEFT JOIN (
	SELECT
		sum( 钱数 ) AS a,
		to_CHAR( 时间字段, 'yyyy-MM' ) AS time 
	FROM
		表 
	WHERE 1=1
	--- 这边添加这个判断条件方便在第一次选取范围的时候能只查询本年度的而不是将表中的所有年度的都进行查询显示 
		AND to_CHAR( 时间字段, 'yyyy' ) = '年份(2022/2023/2024)' 
	GROUP BY
	to_CHAR( tp.SIGN_TIME, 'yyyy-MM' ) 
	) one ON one.time = mon.yaerMonth
	最后这只有 `on` 作为筛选没有 `where` 是因为 使用 `on` 的时候可以将主表(mon)中 12个月份作为主列,都显示出来无论有没有数据,但是 `where` 的话,是只显示符合条件的,这就会把没有数据的月份给过滤出去而不显示
ORACLE中查询本年1-12个月的数据(纵向)
以钱数为例(统计某人本年1-12月的每月的钱数)

SELECT
	* 
	FROM
		(
		SELECT
			sum( decode( to_char( 时间字段, 'mm' ), '01', 钱数字段, 0 ) ) 一月,
			sum( decode( to_char( 时间字段, 'mm' ), '02', 钱数字段, 0 ) ) 二月,
			sum( decode( to_char( 时间字段, 'mm' ), '03', 钱数字段, 0 ) ) 三月,
			sum( decode( to_char( 时间字段, 'mm' ), '04', 钱数字段, 0 ) ) 四月,
			sum( decode( to_char( 时间字段, 'mm' ), '05', 钱数字段, 0 ) ) 五月,
			sum( decode( to_char( 时间字段, 'mm' ), '06', 钱数字段, 0 ) ) 六月,
			sum( decode( to_char( 时间字段, 'mm' ), '07', 钱数字段, 0 ) ) 七月,
			sum( decode( to_char( 时间字段, 'mm' ), '08', 钱数字段, 0 ) ) 八月,
			sum( decode( to_char( 时间字段, 'mm' ), '09', 钱数字段, 0 ) ) 九月,
			sum( decode( to_char( 时间字段, 'mm' ), '10', 钱数字段, 0 ) ) 十月,
			sum( decode( to_char( 时间字段, 'mm' ), '11', 钱数字段, 0 ) ) 十一月,
			sum( decode( to_char( 时间字段, 'mm' ), '12', 钱数字段, 0 ) ) 十二月 
		FROM
			表
		WHERE
			某人字段 = '某人' 
			AND to_char( ADD_TIME, 'yyyy' ) = '2022' 
		) unpivot ( sum1 FOR years IN ( 一月,二月,三月,四月,五月,六月,七月,八月, 九月,十月,十一月,十二月 ) )
ORACLE 查询本年(1-12)月份,每个月份一共有多少数据(纵向)
SELECT
	* 
FROM
	(
	SELECT
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 01, 统计数量代指字段 ) ) AS 一月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 02, 统计数量代指字段 ) ) AS 二月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 03, 统计数量代指字段 ) ) AS 三月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 04, 统计数量代指字段 ) ) AS 四月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 05, 统计数量代指字段 ) ) AS 五月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 06, 统计数量代指字段 ) ) AS 六月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 07, 统计数量代指字段 ) ) AS 七月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 08, 统计数量代指字段 ) ) AS 八月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 09, 统计数量代指字段 ) ) AS 九月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 10, 统计数量代指字段 ) ) AS 十月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 11, 统计数量代指字段 ) ) AS 十一月,
		count( DECODE( EXTRACT( MONTH FROM 时间字段 ), 12, 统计数量代指字段 ) ) AS 十二月 
	FROM
		数据库表 
	WHERE
		1 = 1 
	AND EXTRACT( YEAR FROM 时间字段 ) = '2022' 
	) unpivot ( unpivot FOR years IN ( 一月,二月,三月,四月,五月,六月,七月,八月, 九月,十月,十一月,十二月 ) ) allInto
以上两种ORACLE 查询本年(1-12)个月份数据都是展示为纵向,改为横向只需将 IN 以及后方数据删除即可
( unpivot FOR years IN ( 一月,二月,三月,四月,五月,六月,七月,八月, 九月,十月,十一月,十二月 ) ) allInto
查询今年每个月有多少条数据
SELECT year( 时间字段名 ) as y,month( 时间字段名 ) as m, count(*) as number FROM 表名 WHERE DATE_FORMAT( 时间字段名 ,'%Y') = DATE_FORMAT(SYSDATE(),'%Y') GROUP BY month( 时间字段名 )  (或者 GROUP BY m   )
查询今年每个季度有多少条数据
SELECT QUARTER ( 时间字段名 ),count(*) FROM 表名 WHERE DATE_FORMAT( 时间字段名 ,'%Y') = DATE_FORMAT(SYSDATE(),'%Y')  GROUP BY  QUARTER ( 时间字段名 )

查询上周、上月、上年数据(都是精确到某一周、月、年)

查询上周数据
SELECT * FROM 表名 WHERE YEARWEEK(date_format( 时间字段名 ,'%Y-%m-%d')) = YEARWEEK(now())-1;
查询上月数据
SELECT * FROM 表名 where date_format( 时间字段名 ,'%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')
查询上年数据
SELECT * FROM 表名 WHERE YEAR ( 时间字段名 )= YEAR ( date_sub( now(), INTERVAL 1 YEAR ))
查询上年今天的数据(去年今天)
select * from 表名 where DATE_FORMAT( 时间字段名 ,'%Y-%m-%d' )  = DATE_FORMAT( NOW(),'%Y-%m-%d' )
查询上年每个月都多少条数据
SELECT year( 时间字段名 ) as y,month( 时间字段名 ) as m, count(*) as number FROM 表名 WHERE YEAR ( 时间字段名 )= YEAR ( date_sub( now(), INTERVAL 1 YEAR )) GROUP BY month( 时间字段名 )     (或者 GROUP BY m   )
查询上年每个季度都有多少天数据
SELECT QUARTER ( 时间字段名 ),count(*) FROM 表名 WHERE YEAR ( 时间字段名 )= YEAR ( date_sub( now(), INTERVAL 1 YEAR ))  GROUP BY  QUARTER ( 时间字段名 )

查询前n年、月、周、天记录(包含从查询日期到第n年内的)

查询前n年、月、周 都是 前 n 到现在查询的时间这个时间段中的数据的数量
查询过去10年的数据数量(包含今年)
SELECT 
-- 数据库数据中某年数据的数量
COUNT(*) num, 
-- 数据库数据中某年
YEAR( 时间字段名 ) AS sname, 
-- 当前时间的年份
YEAR(now()) AS nowYear,
-- 距离当前时间年份过去10的年份
YEAR(now()) - 10 AS lastYeaer
FROM 表名 
WHERE
 YEAR( 时间字段名 ) <= YEAR(now()) AND  
 YEAR( 时间字段名 ) > YEAR(now()) - 10 GROUP BY YEAR( 时间字段名 )
查询未来10年的数据数量(包含今年)
SELECT COUNT(*) num, 
-- 数据库数据中某年
YEAR( 时间字段名 ) AS sname, 
-- 当前时间的年份
YEAR(now()) AS nowYear,
-- 距离当前时间年份未来10的年份
YEAR(now()) + 10 AS lastYeaer
FROM 表名 
WHERE
 YEAR( 时间字段名 ) >= YEAR(now()) AND  
 YEAR( 时间字段名 ) < YEAR(now()) + 10 GROUP BY YEAR( 时间字段名 )
注:
一、
在  ‘查询过去10年的数据数量(包含今年)’  和  ‘查询未来10年的数据数量(包含今年)’ 中 包含与不包含几年 和包含与不包含过去/未来的最后一年  都在于
 YEAR(create_time) (>=) (<=) (<) (>) YEAR(now()) AND  
 YEAR(create_time)  (>=) (<=) (<) (>)  YEAR(now()) + 10 GROUP BY YEAR(create_time)
中 具体根据逻辑进行判断
二、
在两个sql中 where 后面第一个判断条件(   YEAR(create_time) (>=) (<=) (<) (>) YEAR(now())  ) 是为了不进行输出未来或者过去的年份
	比如   在查询过去10年的时候  如果不加这个判断  则会输出 未来10年的年份
ORACLE 查询近N年的数据
查询近五年内钱数总数
SELECT
	yaer.yaer,
	one.a,
	one.time 
FROM
	(
	SELECT
		to_char( SYSDATE, 'yyyy' ) AS yaer 
	FROM
		dual UNION
	SELECT
		to_char( SYSDATE - INTERVAL '1' year, 'yyyy' ) AS yaer 
	FROM
		dual UNION
	SELECT
		to_char( SYSDATE - INTERVAL '2' year, 'yyyy' ) AS yaer 
	FROM
		dual UNION
	SELECT
		to_char( SYSDATE - INTERVAL '3' year, 'yyyy' ) AS yaer 
	FROM
		dual UNION
	SELECT
		to_char( SYSDATE - INTERVAL '4' year, 'yyyy' ) AS yaer 
	FROM
		dual UNION
	SELECT
		to_char( SYSDATE - INTERVAL '5' year, 'yyyy' ) AS yaer 
	FROM
		dual 
	) yaer
	LEFT JOIN ( SELECT sum( 金钱字段 ) AS a, to_CHAR( 时间字段, 'yyyy' ) AS time FROM 表 GROUP BY to_CHAR( 时间字段, 'yyyy' ) ) one ON one.time = yaer.yaer
查询6个月前的数据(包含当前月)
SELECT * FROM 表名 WHERE 时间字段名 BETWEEN date_sub(now(),interval 6 month) AND now();
注:
一、
包含当前月意思
 比如查询6个月前  (现在是 12 月 15日)
 则会查询  12 、 11 、 10 、 9 、 8、 7  月 
二、
假如当前时间是 12月15日 数据库中如果有 6月15日之后的数据也会查询出来,不包含6月15日
查询近7天数据
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date( 时间字段名 )
查询过去7天数据
SELECT * FROM 表名 where date( 时间字段名 ) <=  date( now() ) and DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date( 时间字段名 )
月份  日后补充

查询季度

第一季度:1月-3月     第二季度:4月-6月       第三季度:7月-9月     第四季度:10月-12月
查询本季度有多少条记录
SELECT 
-- 查询年份和第几季度,使用 ‘-‘ 连接
CONCAT( YEAR ( create_time ), '-', QUARTER ( create_time )) now_quarter,
-- 查询本季度共有多少条数据
CONUT(*) AS d
 FROM 表名 
 WHERE
 DATE_FORMAT( 时间字段名, '%Y' ) = DATE_FORMAT( SYSDATE(), '%Y' ) AND  QUARTER ( 时间字段名 ) = QUARTER ( now())
 GROUP BY CONCAT( YEAR ( 时间字段名 ), QUARTER ( 时间字段名 )), date_format( 时间字段名, '%Y' ), QUARTER ( 时间字段名 )
上年每个季度共有多少条记录
SELECT QUARTER( 时间字段名 ) AS lquarter,,count(id) AS number, sum( 金钱字段名 ) AS lquantity FROM 表名
 WHERE
 YEAR ( 时间字段名 )= YEAR ( date_sub( now() , INTERVAL 1 YEAR )) AND create_time IS NOT NULL
 GROUP BY QUARTER ( 时间字段名 )
今年每个季度共有多少条记录
SELECT QUARTER( 时间字段名 ) AS lquarter,count(id), sum( 金钱字段名 ) AS lquantity
 FROM 表名 WHERE YEAR ( 时间字段名 )= YEAR (  now() )
 AND create_time IS NOT NULL  GROUP BY QUARTER ( 时间字段名 )
上个季度的数据
SELECT 
QUARTER(DATE_SUB(now(),interval 1 QUARTER)) AS lquarter,
COUNT(id) AS number, 
SUM(money) AS lmoney 
FROM 表名 WHERE QUARTER( 时间字段名 ) = QUARTER(DATE_SUB(now(),interval 1 QUARTER)) ;

====================== 分割线 很华丽 =======================

SQL操作时间语句

查询当前时间

SELECT 
-- 当前时间,精确到年月日时分秒
NOW() AS nowDate
-- 当前时间,精确到年月日时分秒
select SYSDATE()

查询前一小时时间

-- 一小时前,精确到年月日时分秒
SELECT DATE_SUB(NOW(),INTERVAL 1 HOUR) AS lastDate

查询前一小时内的数据

SELECT * FROM 表名 WHERE 时间字段名 BETWEEN DATE_SUB(NOW(),INTERVAL  1 HOUR) AND NOW()
SELECT * FROM 表名 WHERE 时间字段名 BETWEEN DATE_SUB(NOW(),INTERVAL 1 HOUR)  AND  SYSDATE()

查询当前时间之后的所有数据

SELECT * FROM 表名 WHERE 时间字段名 > NOW()

查询当前时间前一小时之后的所有数据

SELECT * FROM 表名 WHERE 时间字段名 > DATE_SUB(NOW(), INTERVAL 60 MINUTE)
SELECT * FROM 表名 WHERE 时间字段名 > DATE_SUB(NOW(), INTERVAL 1 HOUR)

查询今天每个小时内数据总量

SELECT HOUR( 时间字段名 ) AS h, COUNT( * ) AS number 
FROM 表名 
WHERE
	DATE( 时间字段名 ) = DATE(NOW())
-- 根据小时进行分组
GROUP BY h  
-- 根据小时进行排序
ORDER BY h;

查询今天每半小时数据的总量

SELECT HOUR( 时间字段名 ) AS h ,FLOOR( MINUTE ( 时间字段名 ) / 30 ) AS m, COUNT(*) AS number 
FROM 表名 
WHERE DATE( 时间字段名 ) = DATE( NOW() ) 
-- 根据时分进行分组(一个小时有两个分钟区间  0-30   31-60)
GROUP BY h,m 
-- 根据小时进行排序
ORDER BY h;
-- FLOOR()函数,向下取整 例如:FLOOR(29 / 30) = 0   (29/30 = 0.9667)
-- 所以在分钟的时候 30分钟之前的为 0  30分钟之后的为 1 
-- 日后想起好的表达方式在继续优化

查询今天(精确到小时)之后(未来时间)的所有数据

SELECT * FROM 表名 WHERE 时间字段名 > SYSDATE()
SELECT * FROM 表名 WHERE 时间字段名 > DATE_ADD(NOW(),INTERVAL 0 HOUR)

====================== 分割线 很华丽 =======================

SQL操作年、月、周、等第一条、最后一条数据

查询某年第一条、最后一条数据

-- MySQL 语法
SELECT * FROM 表名 WHERE YEAR(时间字段) = YEAR(某年(NOW() 今年)) ORDER BY 时间字段 ASC LIMIT 1

SELECT * FROM 表名 WHERE YEAR(时间字段) = YEAR(某年(NOW() 今年)) ORDER BY 时间字段 DESC LIMIT 1

-- Oracle 语法
SELECT * FROM 表名 WHERE EXTRACT(YEAR FROM 时间字段) = EXTRACT(YEAR FROM SYSDATE) AND ROWNUM = 1 ORDER BY 时间字段 ASC

SELECT * FROM 表名 WHERE EXTRACT(YEAR FROM 时间字段) = EXTRACT(YEAR FROM SYSDATE) AND ROWNUM = 1 ORDER BY 时间字段 DESC

查询某月第一条数据和最后一条数据

-- MySQL 语法
SELECT * FROM 表名 WHERE YEAR(时间字段) = YEAR(某年(NOW() 今年)) AND MONTH(时间字段) = MONTH(某月(NOW() 本月)) ORDER BY 时间字段 ASC LIMIT 1

SELECT * FROM 表名 WHERE YEAR(时间字段) = YEAR(某年(NOW() 今年)) AND MONTH(时间字段) = MONTH(某月(NOW() 本月)) ORDER BY 时间字段 DESC LIMIT 1

-- Oracle 语法
SELECT * FROM 表名 WHERE EXTRACT(YEAR FROM 时间字段 ) = EXTRACT(YEAR FROM SYSDATE) AND EXTRACT(MONTH FROM 时间字段 ) = EXTRACT(MONTH FROM SYSDATE) AND ROWNUM = 1 ORDER BY 时间字段 ASC

SELECT * FROM 表名 WHERE EXTRACT(YEAR FROM 时间字段 ) = EXTRACT(YEAR FROM SYSDATE) AND EXTRACT(MONTH FROM 时间字段 ) = EXTRACT(MONTH FROM SYSDATE) AND ROWNUM = 1 ORDER BY 时间字段 DESC

查询某周第一条数据和最后一条数据

-- MySQL 语法
SELECT * FROM 表名 WHERE YEAR(时间字段) = YEAR(某年(NOW() 今年)) AND WEEK(时间字段) = WEEK(某周(NOW() 本周)) ORDER BY 时间字段 ASC LIMIT 1

SELECT * FROM 表名 WHERE YEAR(时间字段) = YEAR(某年(NOW() 今年)) AND WEEK(时间字段) = WEEK(某周(NOW() 本周)) ORDER BY 时间字段 DESC LIMIT 1

-- Oracle 语法
SELECT * FROM 表名 WHERE EXTRACT(YEAR FROM 时间字段 ) = EXTRACT(YEAR FROM SYSDATE) AND TO_CHAR(date_field, 'IW') = TO_CHAR(SYSDATE, 'IW') AND ROWNUM = 1 ORDER BY date_field ASC

SELECT * FROM 表名 WHERE EXTRACT(YEAR FROM 时间字段 ) = EXTRACT(YEAR FROM SYSDATE) AND TO_CHAR(date_field, 'IW') = TO_CHAR(SYSDATE, 'IW') AND ROWNUM = 1 ORDER BY date_field DESC

查询某个指定月份的第一条数据和最后一条数据

-- 指定时间:  2299-02-01 至  2299-02-30
-- MySQL 语法
SELECT * FROM 表名 WHERE 时间字段 BETWEEN '2299-02-01' AND LAST_DAY('2299-02-30') ORDER BY 时间字段 LIMIT 1

SELECT * FROM 表名 WHERE 时间字段 BETWEEN '2299-02-01' AND LAST_DAY('2299-02-30') ORDER BY 时间字段 DESC LIMIT 1

-- Oracle 语法
SELECT * FROM 表名 WHERE 时间字段 BETWEEN TO_DATE('2299-02-01', 'yyyy-mm-dd') AND LAST_DAY(TO_DATE('2299-02-30', 'yyyy-mm-dd')) AND ROWNUM = 1 ORDER BY 时间字段

SELECT * FROM 表名 WHERE 时间字段 BETWEEN TO_DATE('2299-02-01', 'yyyy-mm-dd') AND LAST_DAY(TO_DATE('2299-02-30', 'yyyy-mm-dd')) ORDER BY 时间字段 DESC AND ROWNUM = 1

Oracle 查询某个月份的第一条数据和最后一条数据

SELECT * FROM (
   SELECT * FROM 表名 WHERE 时间字段 BETWEEN TO_DATE('起始月份时间', 'yyyy-mm-dd') AND LAST_DAY(TO_DATE('起始月份时间', 'yyyy-mm-dd')) ORDER BY date_field ASC
) WHERE ROWNUM = 1

SELECT * FROM (
   SELECT * FROM 表名 WHERE 时间字段 BETWEEN TO_DATE('起始月份时间', 'yyyy-mm-dd') AND LAST_DAY(TO_DATE('起始月份时间', 'yyyy-mm-dd')) ORDER BY date_field DESC
) WHERE ROWNUM = 1

例:==》
SELECT * FROM (
   SELECT * FROM table_name WHERE date_field BETWEEN TO_DATE('2023-05-01', 'yyyy-mm-dd') AND LAST_DAY(TO_DATE('2023-05-01', 'yyyy-mm-dd')) ORDER BY date_field ASC
) WHERE ROWNUM = 1

SELECT * FROM (
   SELECT * FROM table_name WHERE date_field BETWEEN TO_DATE('2023-05-01', 'yyyy-mm-dd') AND LAST_DAY(TO_DATE('2023-05-01', 'yyyy-mm-dd')) ORDER BY date_field DESC
) WHERE ROWNUM = 1

====================== 分割线 很华丽 =======================

对于 group by

对于  group by
-- mysql 中可以这样
select * from 表名 group by 字段A
-- mysql 中也可以这样
select 字段A, 字段B, 表名 group by 字段A
//oracle 中只能
select 字段A from 表名group by 字段A
//oracle 或者
select 字段A, 字段B from 表名 group by 字段A, 字段B
// 但是 
select 字段A, 字段B from 表名 group by 字段A   则会报错

所以 在oracle中 面对 group by 一个但是显示多个有:
select * from
  (select 字段A, 字段B, 字段C,
  		row_number() over(partition by 字段D(也就是需要 group by 的字段 ) order by 字段E(排序字段,也可以没有) desc ) classify(起的别名) from 表名 endData(起的别名))
where endData.classify = 1 (只要排序后的第一条数据)

-- row_number() over  函数是将 数据进行排序(根据 1、2、3 ......)进行排序,然后再最后 使用 (endData.classify = 1 )条件只要第一条数据

关于 时间 转化 等问题

前端传值后端接收 打印或者 bebug 显示 时间为 2023-05-16T19:09:03.000Z 转成 年月日 时分秒

SELECT DATE_FORMAT(CONVERT_TZ('2023-05-16T19:09:03.000Z', '+00:00', '+08:00'), '%Y-%m-%d %H:%i:%s')  AS  dateFormat

结果显示: 2023-05-17 03:09:03

SELECT DATE_FORMAT(CONVERT_TZ('2023-05-16T19:09:03.000Z', '+00:00', '+08:00'), '%Y/%m/%d %H:%i:%s')  AS  dateFormat

结果显示:2023/05/17 03:09:03

前端传值后端接收 打印或者 bebug 显示 时间为 Wed May 17 03:09:03 CST 2023 转成 年月日 时分秒

SELECT DATE_FORMAT(STR_TO_DATE('Wed May 17 03:09:03 CST 2023', '%a %b %d %H:%i:%S CST %Y'), '%Y-%m-%d %H:%i:%s') AS dateFormat

结果显示: 2023-05-17 03:09:03

SELECT DATE_FORMAT(STR_TO_DATE('Wed May 17 03:09:03 CST 2023', '%a %b %d %H:%i:%S CST %Y'), '%Y/%m/%d %H:%i:%s')  AS dateFormat

结果显示: 2023/05/17 03:09:03

----------------------------------------------------------------------------------

后端接受为 数组类型===》String[]、int[]、Date[]......

可以在 xml 中使用 下标选值(但我没成功)

例子(我的)
pojo 中   private Date[] timeFrame;
xml中 
<if test="timeFrame != null and timeFrame != '' and timeFrame.length > 0 ">
这边使用了多次转 类型 上面俩例子,具体转法没写,但都报错为 timeFrame[0] 和timeFrame[1] 为null
            and x.create_time BETWEEN #{timeFrame[0]} and #{endTime[1]}
之后 使用 
            and x.create_time BETWEEN ${timeFrame[0]} and ${endTime[1]}   
传值没问题,但是在sql中少单引号       
</if>