【发布时间】:2021-12-03 02:55:41
【问题描述】:
我正在寻找一些指导,以查找比方说星期一和星期三在两个日期 Date1 和 Date2 之间(包括 Snowflake 中的两个日期)的出现次数。有什么建议吗?
【问题讨论】:
标签: snowflake-cloud-data-platform
我正在寻找一些指导,以查找比方说星期一和星期三在两个日期 Date1 和 Date2 之间(包括 Snowflake 中的两个日期)的出现次数。有什么建议吗?
【问题讨论】:
标签: snowflake-cloud-data-platform
标准做法是构建日历表:作为永久表或内联视图。
CREATE TABLE calendar
AS
SELECT DATEADD(day, ROW_NUMBER() OVER(ORDER BY seq8()), '1999-12-31'::DATE) AS d,
DAYOFWEEK(d) AS day_of_week,
DAYNAME(d) AS day_name
-- month/quarter/year/...
FROM TABLE(GENERATOR(ROWCOUNT => 365*100));
然后:
SELECT c.day_name, COUNT(*) AS cnt
FROM calendar c
WHERE c.d BETWEEN '<date_1>' AND '<date_2>'
AND c.day_of_week IN (1,3)
GROUP BY c.day_name;
注意:星期几取决于参数WEEK_START。
【讨论】:
Lukasz 的表格解决方案相当简洁,但我会尝试 JS 版本:
// not sure the best name to have here
create or replace function num_of_days_in_between(
day_nums varchar(255),
start_date varchar(10),
end_date varchar(10)
)
RETURNS string
LANGUAGE JAVASCRIPT
AS $$
// perform some validations first on parameters
var s = new Date(START_DATE);
var e = new Date(END_DATE);
var split = DAY_NUMS.split(",");
var count = 0;
var d = s;
// go through each day and check if the
// current day is in the days asked
while (d.getTime() <= e.getTime()) {
// split array contains strings, so we need to
// force getDay() value to be string as well,
// otherwise includes() will not find it
if(split.includes(d.getDay()+"")) {
count++;
}
// advance to the next day
d = new Date(d.getTime() + 86400000);
}
return count;
$$;
-- Monday and Wednesday
select num_of_days_in_between('1,3', '2021-10-01', '2021-11-01'); -- 9
-- Tuesday
select num_of_days_in_between('2', '2021-10-01', '2021-11-01'); -- 4
请注意,在 JS 中,日期从星期日开始,索引为 0,请参阅Date.getDay()。
【讨论】: