在SQL中从iso周和年获取日期

时间:2019-03-07 16:06:25

标签: sql date snowflake-datawarehouse snowflake

从iso周和年开始,我想得到一个日期。 日期应该是一周的第一天。 一周的第一天是星期一。 例如iso周10和iso年应转换为2019-03-04。 我正在使用雪花

3 个答案:

答案 0 :(得分:0)

如果没有日期维度表和/或实用程序(如注释中所述),则应从文本形式进行解析。但这将取决于DBMS实现:

  • 在MySQL中:STR_TO_DATE(CONCAT(year, ' ', week), '%x %v')
  • 在PostgreSQL中:TO_DATE(year || ' ' || week, 'IYYY IW')
    (而且Oracle DB也会类似)

答案 1 :(得分:0)

很遗憾,Snowflake本身不支持此功能。

虽然可以手动计算ISO周和年份中的日期,但这非常复杂。因此,就像其他建议一样,为此生成日期维度表要容易得多。

可以为查询生成查询的查询示例(请注意-这不是完整的“日期维度”表-通常每天一行,每周一行)。

OTSession

请注意,您可以使用this.sessionEventHandlers = { streamCreated: event => { const streamProperties = { ...this.state.streamProperties, [event.streamId]: { subscribeToAudio: true, subscribeToVideo: true, style: { width: 400, height: 300, }, } }; this.setState({streamProperties}); }, }; 中的常量来创建所需范围的表。只需记住将星期一作为开始日期,否则表中第一周的值会错误:)

答案 2 :(得分:0)

执行此操作的日期表达式有点复杂,但并非不可能:

SELECT
    DATEADD( /* Calculate start of ISOWeek as offset from Jan 1st */
      DAY,
      WEEK * 7 - CASE WHEN DAYOFWEEKISO(DATE_FROM_PARTS(YEAR, 1, 1)) < 5 THEN 7 ELSE 0 END
      + 1 - DAYOFWEEKISO(DATE_FROM_PARTS(YEAR, 1, 1)),
      DATE_FROM_PARTS(YEAR, 1, 1)
    )
FROM (VALUES (2000, 1), (2000, 2), (2001, 1), (2002, 1), (2003, 1)) v(YEAR, WEEK);