excel如何根据一系列日期数据(yyyymmdd)来统计当年的第几周的个数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了excel如何根据一系列日期数据(yyyymmdd)来统计当年的第几周的个数?相关的知识,希望对你有一定的参考价值。
如图,假设A列有以下日期,-->如何统计A列中2013年第一周有多少个数据?,第2周有多少个数据,。。。第52周有多少个数据?(要使用函数直接在B列生成,而且A列的数据必须是日期,即YYYYMMDD格式。)
要用到数组公式,不需要辅助列,不需要任何其他操作,只需要在B1单元格输入公式如下:
=SUM(IF(INT((A:A-"2013-1-1"+WEEKDAY("2013-1-1")+1)/7)+1=ROW(A1),1,0))
注意:这是个数组公式,要按CTRL+SHIFT+ENTER结束编辑(如果操作成功,则单击B1单元格看到的公式两边是有大括号的)。
然后把这个公式复制下拉52格就行,对应的分别就是第1周至第52周的数据。另外,为了提高计算的速度,可以把公式里的A:A换成你有数据的范围(比如$A$1:$A$100,只有100行数据)
假设条件:
每周是以星期天为第1天;
你所说的2013年的第一周是指2013年1月1日(星期四)至2013年1月4日(星期六)
如果假设条件不符合你的要求,则公式需要稍做改动。
这个公式我看不懂,能解释每段函数对应的意思吗?(假设条件是星期天为第一天,可如果以星期一为第一天,怎么整哦?)因为不懂意思,所以不知道改;
PS:
按照月来统计1~12月的公式是这样的:
=SUMPRODUCT((YEAR(nouvelle!Y$7:Y$41)=2012)*(MONTH(nouvelle!Y$7:Y$41)=1))
,我也不懂这个函数;
刚发现我那个公式写错了,应该是:
=SUM(IF(INT((A:A-"2013-1-1"+WEEKDAY("2013-1-1")-1)/7)+1=ROW(A1),1,0))
说明一下我那个公式的思路吧:
A:A-"2013-1-1“是得到两个日期之间的天数差;
WEEKDAY("2013-1-1")是求2013年1月1日对应的星期几,返回值是整数,其中1对应星期日,2对应星期一,以此类推。例如:2013-1-1对应的是星期二,则WEKDAY("2013-1-1")返回的是3;
INT((A:A-"2013-1-1")+WEEKDAY("2013-1-1")+1)/7的意思是求A行各列日期对应的是第几周,因为天数差从2013年1月1日起是0开始的,如果1月1日是周二的话,则1月6日(天数差为5)就是周日,则是下一周了,即天数差为0至4为第1周,5至11为第2周,为了计算方便,在些基础上加2(WEEKDAY("2013-1-1")-1)即变成:2至6为第1周,7至13为第2周。这样一来用INT取这个值除以7的整数部分即可得到是当年的哪一周了;
ROW(A1)在往下复制的时候会变成ROW(A2)、ROW(A3),相当于第一行是1,第二行是2……以此类推;
然后用IF判断,当A列的数据对应的是第1周时,返回1,否则返回0,然后再用SUM求这个数组的和,这个和也就是第1周的数据数。
如果以星期一为第一天的话,公式改为:
=SUM(IF(INT((A:A-"2013-1-1"+WEEKDAY("2013-1-1")-2)/7)+1=ROW(A1),1,0))
追问怎么还是不行呢?郁闷了。。。
追答你能把你的文件发给我看看吗?或许我的文件有什么细节和你的不一样。
参考技术A 间接方法如下在B1中输入或复制粘贴此公式
=WEEKNUM(A1,2)
下拉填充或双击B1右下角的填充柄
在C1中输入或复制粘贴此公式
=COUNTIF(B:B,ROW(A1))
下拉填充共52或53行 参考技术B 这个比较麻烦点
setp1.首先加入一行计算这些日期是那一周,一般Excel有织带函数weeknum(e12,1)假设日期在e12单元格,如果没有自带weeknum函数就比较麻烦点,要自己写函数,把下面的函数抄进去也可以=IF(E12,INT((E12-DATE(YEAR(E12),1,0)+WEEKDAY(DATE(YEAR(E12),1,0),2)+7-WEEKDAY(E12,2))/7),""),一直往下拉,就可以了
step2,统计周函数
可以用countif函数,把1到54分别写出来,用countif函数统计就可以了,
或者数据图示表一下就出来了, 参考技术C 我想的办法需加一个辅助列,在C1列输入=WEEKNUM(A1,2)后回车,下拉计算,再在B1输入=COUNTIFS(A:A,"<>"&"",C:C,"="&ROW(A1))后回车,下拉到52行,得到所需结果 参考技术D 使用自定义函数
如何检查我的日期格式?
【中文标题】如何检查我的日期格式?【英文标题】:How can I check the format of my date? 【发布时间】:2015-11-10 11:58:27 【问题描述】:我有一张表,我想根据YYYYMMDD,HH24MISS
检查记录的日期时间格式。如果我的记录的日期时间格式不正确,请写一条错误消息。如何在 PL/SQL 中创建函数或过程?
【问题讨论】:
如果您使用原生格式(例如date
)存储值,那么您不必担心格式。
此列的数据类型? if date - 格式将根据 nls_date_format 参数。如果您想以其他格式为本专栏提供鞋履 - 只需使用 to_char 函数
你是对的,但我没有存储这些记录,我需要检查它。你有什么想法吗?
例如这是我的日期 => 10/06/2013 11:05:55 。我想检查一下日期格式是否正确?
Return number from Oracle Select statement after parsing date的可能重复
【参考方案1】:
你可以这样写一个函数:
CREATE OR REPLACE FUNCTION CheckDateString(str IN VARCHAR2) RETURN DATE IS
BEGIN
RETURN TO_DATE(str,'YYYYMMDD,HH24MISS');
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END CheckDateString;
并像这样使用它
SELECT *
FROM my_table
WHERE CheckDateString(DATE_STRING) IS NULL
AND DATE_STRING IS NOT NULL;
当然,下一个行动点是更正错误的值并将该列的数据类型更改为DATE
,分别。 TIMESTAMP
.
【讨论】:
谢谢@Wernfried Domscheit。我曾经像这样更改数据类型 SELECT * FROM my_table WHERE CheckDateString(to_number(to_char(CRTTAR,'YYYYMMDDHH24MISS'))) IS NULL AND CRTTAR IS NOT NULL; 输入数据类型应该是VARCHAR,我改了。 对于你的函数,你认为 10/06/2013 11:05:55 这个日期的返回值是多少? 您没有要求dd/mm/yyyy hh24:mi:ss
格式。根据您的问题,格式为YYYYMMDD,HH24MISS
,对应于20130610,110555
我完全理解你 :) 我应该想到这一点。非常感谢【参考方案2】:
如果您的列是 VARCHAR2 并且您需要检查其中的值是否可以使用您想要的格式转换为日期,这可能是一个解决方案:
declare
v_foo_date date;
begin
for r_date in (
select date_col from my_table
) loop
begin
v_foo_date := to_date(r_date.date_col, 'YYYYMMDD,HH24MİSS');
exception when others then
dbms_output.put_line('error in validating value ' || r_date.date_col);
end;
end loop;
end;
【讨论】:
【参考方案3】:如果您想获取具有所需格式的数据,也许您可以执行以下操作: 否则我会选择 Wernfried Domscheit 的答案。
将日期转换为表格中的日期时间
select *, cast(yourDateColumn as datetime) as verifiedDate
into #tempTable
from yourTable
然后将yourTable
中的数据与#tempTable
中的数据进行对比
select * from yourTable yt
inner join #tempTable tt on
yt.yourDateColum = tt.verifiedDate and yt.ID = tt.ID
【讨论】:
以上是关于excel如何根据一系列日期数据(yyyymmdd)来统计当年的第几周的个数?的主要内容,如果未能解决你的问题,请参考以下文章
在excel中 如何快速吧日期格式ddmmyyyy改为yyyymmdd这种
excel 日期格式为 "yyyymmdd hhmm" 如何计算两个时间的差?
请问在excel中如何把数值YYYYMMDD转换为日期YYYY-MM-DD呢?如果直接设置单元格格式为日期,只能显示一连串