Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Power BI创建日期表的几种方式概览

Power BI创建日期表的几种方式概览

作者头像
陈学谦
发布于 2020-04-14 07:24:27
发布于 2020-04-14 07:24:27
6.6K0
举报
文章被收录于专栏:学谦数据运营学谦数据运营

几乎所有的报表模型都涉及到日期和时间,因此要创建Power BI报表,日期表就必须得有。虽然最新的Power BI版本已经可以自动为每一个时间列创建日期表。

但这种方式还是存在明显缺点的,一方面如果日期列有两个及以上且分散在不同的table中,无法使用一对多关系来管理这些数据,更何况如果一个table中出现两个时间列(如订单日期和发货日期等)时就无法处理;另一方面,如果数据量特别大,或日期列比较多,自动创建的日期会严重影响性能,因此大部分情况下使用自动智能日期是不合适的。

今天给大家介绍三个创建Power BI日期表的途径,分别对应着一种语言,Excel中的VBA语言,适用于Power BI和PowerPivot的DAX语言,适用于Power BI和PowerQuery的M语言,每一种途径都各有优势和劣势,大家可以视情况而定。

第一种是VBA语言:

直接用excel中的vba语言编写,通过添加简单的按钮可以实现一键创建日期表,并灵活修改起止日期。因为我这个项目的日期有特殊的要求,是截至到当前的,大家需要设置结束日期可以设置一个enddate来控制。

Sub date() Dim i Dim origin_date Dim ws, w As Worksheet

For Each w In Worksheets If w.Name <> "使用说明" Then Application.DisplayAlerts = False w.Delete Application.DisplayAlerts = True End If Next

origin_date = Sheets("使用说明").Range("G10") Set ws = Worksheets.Add ws.Name = "日期"

ws.Range("A:A").NumberFormatLocal = "YYYY-MM-DD" ws.Cells(1, 1) = "日期" ws.Cells(2, 1) = origin_date For i = 3 To DateDiff("d", origin_date, Now) + 1 ws.Cells(i, 1) = ws.Cells(i - 1, 1) + 1

Next i

ActiveWorkbook.SaveAs Path & "\date.xlsx", FileFormat:=xlWorkbookDefault

End Sub

使用VBA来编写日期表的最大好处是完全不需要修改pbix文件,尤其是对于在线自动刷新的报表,将连接的日期表修改后,网关自动刷新,而无需重新发布报表。

第二种是DAX语言:

这是使用Power BI绕不过去的坎,需要人人掌握的。利用DAX生成日期表,使用几个不同的函数都可以做到,常用的有以下几种组合:

1、ADDCOLUMNS与CALENDAR函数: 日期表1 = ADDCOLUMNS ( CALENDAR (DATE(2017,1,1), DATE(2019,12,31)), "年度", YEAR ( [Date] ), "季度", "Q" & FORMAT ( [Date], "Q" ), "月份", FORMAT ( [Date], "MM" ), "日",FORMAT ( [Date], "DD" ), "年度季度", FORMAT ( [Date], "YYYY" ) & "Q" & FORMAT ( [Date], "Q" ), "年度月份", FORMAT ( [Date], "YYYY/MM" ), "星期几", WEEKDAY ( [Date],2 ) )

2、GENERATE和CALENDAR函数 日期表2= GENERATE ( CALENDAR ( DATE ( 2017, 1, 1 ), DATE ( 2019, 12, 31 ) ), VAR currentDay = [Date] VAR year = YEAR ( currentDay ) VAR quarter = "Q" & FORMAT ( currentDay, "Q" ) VAR month = FORMAT ( currentDay, "MM" ) VAR day = DAY( currentDay ) VAR weekid = WEEKDAY ( currentDay,2) RETURN ROW ( "年度", year , "季度",quarter, "月份", month, "日", day, "年度季度", year&quarter, "年度月份", year&month, "星期几", weekid ) )

3、GENERATE与CALENDARAUTO函数 日期表3= GENERATE ( CALENDARAUTO(), VAR currentDay = [Date] VAR year = YEAR ( currentDay ) VAR quarter = "Q" & FORMAT ( currentDay, "Q" ) VAR month = FORMAT ( currentDay, "MM" ) VAR day = DAY( currentDay ) VAR weekid = WEEKDAY ( currentDay,2) RETURN ROW ( "年度", year , "季度",quarter, "月份", month, "日", day, "年度季度", year&quarter, "年度月份", year&month, "星期几", weekid ) )

这一段代码中并没有指定起止日期,这就是CALENDARAUTO函数的厉害之处,它可以自动检测模型中其他表中所有日期,然后生成涵盖这些日期的整年日期表。 而且如果模型中其他表的日期范围发生变动,这个日期表也会自动更新到新的日期范围,利用CALENDARAUTO可以很轻松的制作一个动态的日期表。 使用上面三种DAX函数生成日期表还有一个小小的遗憾,就是CALENDAR函数生成的日期列字段名都是英文的[Date],而其他列都是中文,不过可以在生成日期表后进行手动更改,这个比较简单。第三种方法是使用M语言:对于很多Power BI使用者来说,尤其是没有接触过PowerQuery的人来说,M语言比较少用,也比较难一些,在这里直接给出表达式,复制粘贴即可。首先创建两个参数,kaishiDate和jieshuDate来确定起始日期和结束日期,然后在查询编辑器中,新建一个空查询,打开高级编辑器,粘贴以下代码,回车即可。let 日期序列= {Number.From(kaishiDate)..Number.From(jieshuDate)}, 转换为表= Table.FromList(日期序列, Splitter.SplitByNothing(), null, null, ExtraValues.Error), 更改的类型= Table.TransformColumnTypes(转换为表,{{"Column1", type date}}), 重命名的列= Table.RenameColumns(更改的类型,{{"Column1", "日期ID"}}), 年= Table.AddColumn(重命名的列, "年份序号", each Date.Year([日期ID]),type number), 月= Table.AddColumn(年, "月", each Date.Month([日期ID]),type number), 月份名称= Table.AddColumn(月, "月份名称", each Date.ToText([日期ID],"M月"),type text), 年月序号= Table.AddColumn(月份名称, "年月序号", each Date.ToText([日期ID],"yyyyMM"),type number), 季度序号= Table.AddColumn(年月序号, "季度序号", each Date.QuarterOfYear([日期ID]),type number), 日= Table.AddColumn(季度序号, "日", each Date.Day([日期ID]),type number), 星期= Table.AddColumn(日, "星期", each Date.DayOfWeek([日期ID],0),type number) in 星期

甚至更加霸道的完美版,参考佐罗老师的erBI战友联盟的文章,可以直接调用函数来创建,并且可以自定义设置。

let

CalendarType = type function ( optional CalendarYearStart as (type number meta [ Documentation.FieldCaption = "开始年份,日期表从开始年份1月1日起。", Documentation.FieldDescription = "日期表从开始年份1月1日起", Documentation.SampleValues = { Date.Year( DateTime.LocalNow( ) ) - 1 } // Previous Year ]), optional CalendarYearEnd as (type number meta [ Documentation.FieldCaption = "结束年份,日期表至结束年份12月31日止。", Documentation.FieldDescription = "日期表至结束年份12月31日止", Documentation.SampleValues = { Date.Year( DateTime.LocalNow( ) ) } // Current Year ]),

optional CalendarFirstDayOfWeek as (type text meta [ Documentation.FieldCaption = "定义一周开始日,从 Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday中选择一个,缺省默认为Monday。", Documentation.FieldDescription = "从 Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday中选择一个,缺省默认为Monday。", Documentation.SampleValues = { "Monday" } ]),

optional CalendarCulture as (type text meta [ Documentation.FieldCaption = "指定日期表显示月以及星期几的名称是中文或英文,en 表示英文,zh 表示中文,缺省默认与系统一致。", Documentation.FieldDescription = " en 表示英文,zh 表示中文,缺省默认与系统一致。", Documentation.SampleValues = { "zh" } ])

) as table meta [ Documentation.Name = "构建日期表", Documentation.LongDescription = "创建指定年份之间的日期表。并可进行各种设置。", Documentation.Examples = { [ Description = "返回当前年份日期表", Code = "CreateCalendar()", Result = "当前年份日期表。" ], [ Description = "返回指定年份的日期表", Code = "CreateCalendar( 2017 )", Result = "返回2017/01/01至2017/12/31之间的日期表。" ], [ Description = "返回起止年份之间的日期表", Code = "CreateCalendar( 2015 , 2017 )", Result = "返回2015/01/01至2017/12/31之间的日期表。" ], [ Description = "返回起止年份之间的日期表,并指定周二为每周的第一天", Code = "CreateCalendar( 2015 , 2017 , ""Tuesday"" )", Result = "2015/01/01至2017/12/31之间的日期表,且周二是每周的第一天。" ], [ Description = "返回起止年份之间的日期表,并指定周二为每周的第一天,并使用英文显示名称。", Code = "CreateCalendar( 2015 , 2017 , ""Tuesday"", ""en"" )", Result = "2015/01/01至2017/12/31之间的日期表,且周二是每周的第一天,并使用英文显示月名称及星期几的名称。" ] } ], CreateCalendar = ( optional CalendarYearStart as number, optional CalendarYearEnd as number, optional CalendarFirstDayOfWeek as text, optional CalendarCulture as text) => let begin_year = CalendarYearStart , end_year = CalendarYearEnd , first_day_of_week = if Text.Lower( CalendarFirstDayOfWeek ) = "monday" then Day.Monday else if Text.Lower( CalendarFirstDayOfWeek ) = "tuesday" then Day.Tuesday else if Text.Lower( CalendarFirstDayOfWeek ) = "wednesday" then Day.Wednesday else if Text.Lower( CalendarFirstDayOfWeek ) = "thursday" then Day.Thursday else if Text.Lower( CalendarFirstDayOfWeek ) = "friday" then Day.Friday else if Text.Lower( CalendarFirstDayOfWeek ) = "saturday" then Day.Saturday else if Text.Lower( CalendarFirstDayOfWeek ) = "sunday" then Day.Sunday else if CalendarFirstDayOfWeek <> null then error "参数错误:参数CalendarFirstDayOfWeek必须是Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday中的一个。" else Day.Monday , culture = if CalendarCulture <> null then CalendarCulture else "zh" , // "en" , "zh" y1 = if begin_year <> null then begin_year else if end_year <> null then end_year else Date.Year( DateTime.LocalNow() ) , y2 = if end_year <> null then end_year else if begin_year <> null then begin_year else Date.Year( DateTime.LocalNow() ) , calendar_list = { Number.From ( #date( Number.From( y1 ) , 1 , 1 ) ) .. Number.From( #date( Number.From( y2 ) , 12, 31 ) ) }, calendar_list_table = Table.FromList(calendar_list, Splitter.SplitByNothing(), null, null, ExtraValues.Error), #"Changed Type" = Table.TransformColumnTypes(calendar_list_table,{{"Column1", type date}}), #"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{"Column1", "Date"}}), #"Inserted Year" = Table.AddColumn(#"Renamed Columns", "Year", each Date.Year([Date]), Int64.Type), #"Inserted Quarter" = Table.AddColumn(#"Inserted Year", "Quarter", each Date.QuarterOfYear([Date]), Int64.Type), #"Inserted Month" = Table.AddColumn(#"Inserted Quarter", "Month", each Date.Month([Date]), Int64.Type), #"Inserted Week of Year" = Table.AddColumn(#"Inserted Month", "WeekOfYear", each Date.WeekOfYear( [Date] , first_day_of_week ), Int64.Type), #"Inserted Week of Month" = Table.AddColumn(#"Inserted Week of Year", "WeekOfMonth", each Date.WeekOfMonth( [Date] ), Int64.Type), #"Inserted Start of Week" = Table.AddColumn(#"Inserted Week of Month", "DateOfWeekStart", each Date.StartOfWeek( [Date] ), type date), #"Inserted End of Week" = Table.AddColumn(#"Inserted Start of Week", "DateOfWeekEnd", each Date.EndOfWeek([Date]), type date), #"Inserted Day" = Table.AddColumn(#"Inserted End of Week", "DayOfMonth", each Date.Day([Date]), Int64.Type), #"Inserted Day of Week" = Table.AddColumn(#"Inserted Day", "DayOfWeek", each Date.DayOfWeek( [Date] , first_day_of_week ), Int64.Type), #"Inserted Day of Year" = Table.AddColumn(#"Inserted Day of Week", "DayOfYear", each Date.DayOfYear([Date]), Int64.Type), #"Inserted Day Name" = Table.AddColumn(#"Inserted Day of Year", "DayOfWeekName", each Date.DayOfWeekName( [Date] , culture ), type text), #"Inserted Year Name" = Table.AddColumn(#"Inserted Day Name", "YearName", each "Y" & Text.From( [Year] ) , type text ), #"Inserted Quarter Name" = Table.AddColumn(#"Inserted Year Name", "QuarterName", each "Q" & Text.From( [Quarter] ) , type text ), #"Inserted Month Name" = Table.AddColumn(#"Inserted Quarter Name", "MonthName", each Date.MonthName( [Date] , culture ), type text), #"Inserted Week Name" = Table.AddColumn(#"Inserted Month Name", "WeekName", each "W" & Text.From( [WeekOfYear] ) , type text ), #"Inserted Year Quarter" = Table.AddColumn(#"Inserted Week Name", "YearQuarter", each [Year] * 100 + [Quarter] , Int64.Type ), #"Inserted Year Month" = Table.AddColumn(#"Inserted Year Quarter", "YearMonth", each [Year] * 100 + [Month] , Int64.Type ), #"Inserted Year Week" = Table.AddColumn(#"Inserted Year Month", "YearWeek", each [Year] * 100 + [WeekOfYear] , Int64.Type ), #"Inserted Date Code" = Table.AddColumn(#"Inserted Year Week", "DateCode", each [Year] * 10000 + [Month] * 100 + [DayOfMonth] , Int64.Type ) in if culture = "zh" then Table.RenameColumns( #"Inserted Date Code" ,{{"Date", "日期"}, {"Year", "年"}, {"Quarter", "季"}, {"Month", "月"}, {"WeekOfYear", "周"}, {"WeekOfMonth", "月周"}, {"DayOfMonth", "月日"}, {"DateOfWeekStart", "周开始日期"}, {"DateOfWeekEnd", "周结束日期"}, {"DayOfWeek", "周天"}, {"DayOfYear", "年日"}, {"DayOfWeekName", "星期几名称"}, {"YearName", "年份名称"}, {"QuarterName", "季度名称"}, {"MonthName", "月份名称"}, {"WeekName", "周名称"}, {"YearQuarter", "年季"}, {"YearMonth", "年月"}, {"YearWeek", "年周"}, {"DateCode", "日期码"}}) else #"Inserted Date Code"

in Value.ReplaceType( CreateCalendar , CalendarType )

ok,以上就是三个主要的创建日期表的途径,每一种都有自己的优缺点,具体来说 1.VBA语言最大的好处是只需要修改原始文件,无需重新发布新的报表,缺点是需要用到另一门语言;

2.DAX是最灵活的,也是日常都在用的,且用CALENDARAUTO函数可以自动识别模型中的最大最小日期,实现自动调整,缺点是需要修改相关标题;

3.M语言是最强大的,通过参数自动化设置想要的各种各样的日期格式,缺点是如果日期表设置不合理,需要重新发布新的报表。

以上三个途径都有多种表达式写法,追求简单的有简单的做法,追求完美的有完美的方式。当然,一般随着数据的越来越多,模型越来越复杂,对于日期表的需求也会不断地提升,可以适当采用添加列的方式创建更多符合业务需求的格式。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PowerBI生命管理大师学谦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PowerBI中的函数日期表
在PowerBI中,日期表的问题是始终都无法绕过的一个问题,首先是微软默认的日期表月份显示如下:
PowerBI丨白茶
2021/09/02
2.1K0
PowerBI中的函数日期表
HDOJ(HDU) 2133 What day is it(认识下Java的Calendar类---日期类)
Problem Description Today is Saturday, 17th Nov,2007. Now, if i tell you a date, can you tell me w
谙忆
2021/01/21
2230
python开发_calendar
如果你用过linux,你可能知道在linux下面的有一个强大的calendar功能,即日历
Hongten
2018/09/13
7120
Java日期计算常用方法《详细版》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》 🐅 学会Golang语言,畅玩云原生,走遍大小厂~
猫头虎
2024/04/07
2210
1.1 PowerBI数据准备-复制粘贴PowerQuery代码,生成多功能日期表
加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,还可以提问交流。
PowerBI自己学_轻松
2025/02/20
680
1.1 PowerBI数据准备-复制粘贴PowerQuery代码,生成多功能日期表
java calendar 设置小时_Java Calendar类的时间操作[通俗易懂]
Java Calendar 类时间操作,这也许是创建日历和管理最简单的一个方案,示范代码很简单,演示了获取时间,日期时间的累加和累减,以及比较。
全栈程序员站长
2022/08/12
1.6K0
java calendar 设置小时_Java Calendar类的时间操作[通俗易懂]
好多Javascript日期选择器呀–2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>"> <html xmlns="<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>"> <head> <title>calender select</title> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> <style type='text/css'> body {      font-family:"Lucida sans unicode", sans-serif;      font-size:12px;      margin:0;      padding:0;      height:100%;      } #basis {      display:inline;      position:relative;      } #calender {      position:absolute;      top:30px;      left:0;      width:220px;      background-color:#fff;      border:3px solid #ccc;      padding:10px;      z-index:10;      } #control {      text-align:center;      margin:0 0 5px 0;      } #control select {      font-family:"Lucida sans unicode", sans-serif;      font-size:11px;      margin:0 5px;      vertical-align:middle;      } #calender .controlPlus {      padding:0 5px;      text-decoration:none;      color:#333;      } #calender table {      empty-cells: show;      width:100%;      font-size:11px;      table-layout:fixed;      } #calender .weekdays td{      text-align:right;      padding:1px 5px 1px 1px;      color:#333;      } #calender .week td {      text-align:right;      cursor:pointer;      border:1px solid #fff;      padding:1px 4px 1px 0;      } #calender .week .today {       background-color:#ccf;      border-color:#ccf;      } #calender .week .holiday {      font-weight: bold;      } #calender .week .hoverEle {      border-color:#666;      background-color:#99f;      color:#000;      }
Java架构师必看
2021/03/22
6640
【重学 MySQL】三十二、日期时间函数
GET_FORMAT函数中date_type和format_type参数取值如下:
用户11332765
2024/10/28
810
【重学 MySQL】三十二、日期时间函数
地表最强Power Query 日期表
你能想到的关于日期的维度,上面都有了: 共31列。 想怎么分析,就怎么分析: 缺陷:英文版。但可以自己适当修改成中文。 PQ源代码,直接复制使用即可: let // To be turned into parameter startDate = #date(2017,01,01) as date, // To be turned into parameter endDate = #date(2022,12,31) as date, // To be turned into parameter
陈学谦
2022/02/17
9050
地表最强Power Query 日期表
Python获取当前日期的所属信息
编写一个获取当前日期所属的周的所有日期信息,程序需要的模块是datetime日期模块calendar日历模块。
算法与编程之美
2024/01/04
1700
Python获取当前日期的所属信息
获取上下一个工作日实践
其实这个文章个人之前有进行过发布和讨论,在上一篇文章中,介绍了如何通过postgresql数据库的sql语句构建一个工作日的表,并且介绍如何使用sql语法获取某一天往前或者往后的工作日或者自然日,但是实际阅读之后发现缺少了很多细节,故这里重新梳理一下整个过程,希望可以给读者一个参考。
阿东
2021/12/20
7890
获取上下一个工作日实践
Power Query 系列 (18) - 参数化查询
参数化查询增加了查询的灵活性。Power Query 可以设置和管理参数,同一工作簿下所有查询都可以使用。
StoneWM
2021/03/25
2.5K0
kettle生成节假日数据原来还可以这样操作?
最近有好多小伙伴私信我,遇到一个问题在做数仓项目中遇到了瓶颈有的需求需要根据节假日去统计信息。但是由于节假日每年都不一样目前提供的方法没法动态的去获取关于节假日的信息。所以自己去编写一个实现类就完成这个操作。
大数据老哥
2021/02/04
8920
kettle生成节假日数据原来还可以这样操作?
PowerQuery 如何获取起止日期内包含的月份?
今天在群里看到一个问题,如何获取起始日期和结束日期之间包含的所有月份,业务逻辑见下图:
披头
2020/05/13
2.3K0
一次工作日的获取技巧记录
工作日的获取还是比较常见的,比如银行和跨境电商的交易,有时候在教育的行业也会有用到,由于我们不知道每一年那一天是节假日,有时候涉及调休等等又要上班比较麻烦,所以这里干脆做一次记录,以后用到的时候可以直接把表拿来做参考,希望这次的笔记能对读者有所帮助。
阿东
2021/11/02
7660
节假日API调用失效,看我如何解决!
上一篇博客为大家分享了Kettle的骚操作——生成年度节假日表,其中在JS代码中调用了节假日API。
大数据梦想家
2021/01/27
2.7K0
节假日API调用失效,看我如何解决!
Java获取上一周、上一个月、上一年的时间
SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); Calendar c = Calendar.getInstance(); 1.过去七天 c.setTime(new Date()); c.add(Calendar.DATE, - 7); Date d = c.getTime(); String day = format.format(d); System.out.println(“过去七天:”+day); 2
栗筝i
2022/12/01
1.9K0
hive sql生成数仓日期维表
目录 一、建表ddl 二、加工sql 三、示例结果数据 ---- 一、建表ddl create table dim_date( id bigint comment '序号', day_yyyy_mm_dd string comment '日期(yyyy-MM-dd)', day_yyyymmdd string comment '日期(yyyymmdd)', month_yyyymm string comment '年月
chimchim
2022/11/13
9360
hive sql生成数仓日期维表
Java工具集-日期(DateUtils)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/10/28
3.3K0
mysql中关于时间统计的sql语句总结
在之前写VR360时有一个统计页面(https://vr.beifengtz.com/p/statistics.html),在此页面的数据统计时用到了很多mysql中日期函数和时间统计sql语句,当时也是参考了一些资料才写出来的。在平时开发中,涉及到统计数据、报表甚至大数据计算时一定会使用这些日期函数,其他关系数据库也是类似的,我是以mysql为例,比较简单还免费嘛。话不多说,下面直接列出常用的时间统计sql语句,记录下来方便以后学习巩固。
beifengtz
2019/06/03
3.6K0
相关推荐
PowerBI中的函数日期表
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文