首页 > 解决方案 > 从特定时区的给定日期起每 14 天执行一次作业的 Cron 脚本

问题描述

我想从特定日期和时区每 14 天在 CRON 中执行一次作业。

例如,在 CST 时区每 14 天从 6 月 24 日开始。

标签: snowflake-cloud-data-platformsnowflake-schema

解决方案


每两周运行一次工作

简单的方法

最简单的方法是创建任务,从您希望它首次运行开始每 14 天运行一次,如下所示:

CREATE TASK mytask_fortnightly
  WAREHOUSE = general
  SCHEDULE = '20160 MINUTE'
AS
  SELECT 'Hello world'

这个怎么运作

因为一小时有 60 分钟,一天有 24 小时,两周有 14 天,所以这就是 20,160 分钟。

警告

上述解决方案不是从给定日期/时间每两周运行一次任务,而是从创建任务后每两周运行一次。

尽管这是最简单的方法,但它确实需要您名义上在场,以便在确切期望的下一个计划时间创建任务。

但是,作为一种解决方法,您可以创建一次性任务,以便在准确的日期/时间第一次为您执行此操作。这意味着您不必记住要醒来/提醒/出席自己手动执行此操作,并且您可以在之后清理创建任务。

更难的方式。

其他解决方案将要求您创建一个每周四运行的任务(因为 2021 年 6 月 24 日是/曾经是星期四,接下来的每个星期四将是休息周或两周)

例如SCHEDULE = 'USING CRON 0 0 * * THU'

然后,您将为其添加特定逻辑以确定正确的两周是哪一个。

使用这种方法也会产生非周的执行成本,以确定它是否是正确的一周。

Javascript SP

在 javascript 中,您可以通过从当前日期减去开始日期来确定它是否是正确的星期,如果它不是 14 天的倍数,则将其用作使 SP 短路的条件。

const deltaMs = (new Date) - (new Date('2021-06-24'));
const deltaDays = ~~(deltaMs / 86400000);
const run = deltaDays % 14 === 0;
if (!run) return;

// ... continue to do what you want.

SQL

WHERE您还可以在子句或IFF/CASE函数中使用以下 SQL 条件来检查是否是两周。

DATEDIFF('day', '2021-06-24', CURRENT_DATE) % 14 = 0

推荐阅读