主题:[讨论]取出每个月最后一天的数据
雨来何往
[专家分:0] 发布于 2009-09-24 11:05:00
我有一个表(表名:daily_data),内有相关数据,主要就是一个日期列(date),一个数值列。
我想通过条件语句筛选其中每个月最后一天的数据,我目前想到的办法如下:
use daily_data
set filter to INLIST(MONTH(date),4,6,9,11) AND DAY(date)=30 OR DAY(date)=31 OR MONTH(date)=2 AND DAY(date)=28
browse
但是问题是,闰年的情况没有考虑到。
另外,希望高人指点,看有没有更好地办法可以筛出这种数据
回复列表 (共11个回复)
沙发
alpen [专家分:1140] 发布于 2009-09-24 11:26:00
主要就是一个日期列(date)
可以考虑有日期列(date)取下个月的1日,然后再减去1,就能实现每个月最后一天的数据啦!
年要判if(当前月<12,year(date),year(date)+1)
下个月就是if(当前月<12,当前月+1,1)
板凳
sywzs [专家分:5650] 发布于 2009-09-24 11:39:00
下面的筛选可以得到任何一个月的月末的日期
SET FILTER TO date=iif(MONTH(date)<12,CTOD(STR(YEAR(date),4)+"."+STR(MONTH(date)+1,2)+".01")-1,CTOD(STR(YEAR(date)+1,4)+".01.01")-1)
3 楼
雨来何往 [专家分:0] 发布于 2009-09-24 11:40:00
1楼的大哥,我是用set filter to,这个后面好像不能用if语句了
4 楼
sywzs [专家分:5650] 发布于 2009-09-24 11:48:00
不是 IF 而是 IIF()
SET FILTER TO date=iif(MONTH(date)<12,CTOD(STR(YEAR(date),4)+"."+STR(MONTH(date)+1,2)+".01")-1,CTOD(STR(YEAR(date)+1,4)+".01.01")-1)
5 楼
雨来何往 [专家分:0] 发布于 2009-09-24 13:21:00
请问2楼的专家,为什么我跑出来的结果是
/ /
空的
研究出来了,如果我的日期是12月份的那就不能用您的这条语句了
6 楼
alpen [专家分:1140] 发布于 2009-09-24 13:34:00
借用4楼作者:sywzs的代码
将date 改为系统当前date()
?iif(MONTH(date())<12,CTOD(STR(YEAR(date()),4)+"."+STR(MONTH(date())+1,2)+".01")-1,CTOD(STR(YEAR(date())+1,4)+".01.01")-1)
能出2009-09-30
/ /
空的
所以估计你的date是空的没有数据
7 楼
雨来何往 [专家分:0] 发布于 2009-09-24 14:10:00
嗯,不是空的,而是我第一个日期就是12月的,我用的是
SET FILTER TO int(MONTH(date))<>12 AND date=CTOD(STR(MONTH(date)+1,2)+"-01"+"-"+STR(YEAR(date),4))-1 OR int(MONTH(date))=12 AND date=CTOD(STR(MONTH(date),2)+"-01"+"-"+STR(YEAR(date),4))-1
谢谢你
8 楼
sywzs [专家分:5650] 发布于 2009-09-24 15:34:00
[quote]请问2楼的专家,为什么我跑出来的结果是
/ /
空的
研究出来了,如果我的日期是12月份的那就不能用您的这条语句了[/quote]
设置一下系统开关
SET CENT ON
SET DATE ANSI
9 楼
lbscyb [专家分:4780] 发布于 2009-09-24 23:14:00
use daily_data
dDate = {^2009-09-01} - 1
set filter to 日期字段 = dDate
browse
本题思路:最后一天不好确定,但可以肯定的是每月的第一天是1号,那么次月的第一天的前1天就是本月的月末了~~~~
10 楼
moz [专家分:37620] 发布于 2009-09-25 01:27:00
t1=date()
t2=t1-day(t1)+32
t3=t2-day(t2)
我来回复