前提:
场景设置:表T,其中有属性date表示表中数据的更新时间。
问题:取一个月的数据:2015 年1月的数据。
取前一个月的数,当前月份未知。
一,取一个月的数据
对于知道确定月份的需求,SQL处理很简单:
SELECT * FROM T WHERE TO_CHAR(date,'yyyy-mm')='2015-01';
二,取前一个月的数
这个就需要从sysdate着手,需要从此获取到前一个月的具体月份值:
参考:http://www.cnblogs.com/mybi/archive/2012/09/05/2671761.html
SELECT CONCAT(TO_CHAR(SYSDATE, 'yyyy') ||
TO_CHAR(ADD_MONTHS(SYSDATE, -1), '-MM-'), '01 00:00:00') START_TIME
,
CONCAT(TO_CHAR(SYSDATE, 'yyyy') ||
TO_CHAR(ADD_MONTHS(SYSDATE, -1), '-MM-') ||
TO_CHAR(LAST_DAY(SYSDATE), 'dd '), '23:59:59') END_TIME
FROM DUAL;
结果:
解读:
1,CONCAT(字串1, 字串2, 字串3, ...):
将字串1、字串2、字串3,等字串连在一起。请注意,Oracle的CONCAT()只允许两个参数;换言之,一次只能将两个字串串连起来。不过,在Oracle中,我们可以用'||'来一次串连多个字串。
- MySQL: CONCAT()
- Oracle: CONCAT(), ||
- SQL Server: +
2,T0_CHAR(,):
表 5-8. 用于 date/time 转换的模板
模板 描述 HH 一天的小时数 (01-12) HH12 一天的小时数 (01-12) HH24 一天的小时数 (00-23) MI 分钟 (00-59) SS 秒 (00-59) SSSS 午夜后的秒 (0-86399) AM or A.M. or PM or P.M. 正午标识(大写) am or a.m. or pm or p.m. 正午标识(小写) Y,YYY 带逗号的年(4 和更多位) YYYY 年(4和更多位) YYY 年的后三位 YY 年的后两位 Y 年的最后一位 BC or B.C. or AD or A.D. 年标识(大写) bc or b.c. or ad or a.d. 年标识(小写) MONTH 全长大写月份名(9字符) Month 全长混合大小写月份名(9字符) month 全长小写月份名(9字符) MON 大写缩写月份名(3字符) Mon 缩写混合大小写月份名(3字符) mon 小写缩写月份名(3字符) MM 月份 (01-12) DAY 全长大写日期名(9字符) Day 全长混合大小写日期名(9字符) day 全长小写日期名(9字符) DY 缩写大写日期名(3字符) Dy 缩写混合大小写日期名(3字符) dy 缩写小