美文网首页js css html
第157章 SQL函数 WEEK

第157章 SQL函数 WEEK

作者: Cache技术分享 | 来源:发表于2022-05-31 08:36 被阅读0次

    第157章 SQL函数 WEEK

    一个日期函数,它将一年中的第几周作为日期表达式的整数返回。

    大纲

    {fn WEEK(date-expression)}
    

    参数

    • date-expression - 一个表达式,它是列的名称、另一个标量函数的结果,或者是日期或时间戳文字。

    描述

    WEEK 接受一个日期表达式,并返回该日期从年初开始的周数。

    默认情况下,使用 $HOROLOG 日期(从 1840 年 12 月 31 日开始的正整数或负整数天数)计算周数。因此,周数是逐年计算的,因此第 1 周是完成从上一年最后一周开始的 7 天期间的天数。一周总是从星期日开始;因此,日历年的第一个星期日标志着从第 1 周到第 2 周的变化。如果一年中的第一个星期日是 1 月 1 日,则该星期日是第 1 周;如果一年中的第一个星期日晚于 1 月 1 日,则该星期日是第 2 周的第一天。因此,第 1 周的长度通常少于 7 天。可以使用 DAYOFWEEK 函数确定星期几。一年中的总周数通常为 53,闰年可能为 54

    IRIS 还支持确定一年中星期的 ISO 8601 标准。该标准主要用于欧洲国家。当配置为 ISO 8601 时,WEEK 从星期一开始计算星期,并将星期分配给包含该星期星期四的年份。例如,2004 年的第 1 周从 2003 年 12 月 29 日星期一到 2004 年 1 月 4 日星期日,因为本周的星期四是 2004 年 1 月 1 日,这是 2004 年的第一个星期四。2005 年的第 1 周是从 2005 年 1 月 3 日星期一到 1 月 9 日星期日2005,因为它的星期四是 2005 年 1 月 6 日,也就是 2005 年的第一个星期四。一年中的总周数通常是 52,但偶尔也可能是 53。要激活 ISO 8601 计数, SET ^%SYS("sql","sys","week ISO8601")=1.

    日期表达式可以是 日期整数、$HOROLOG$ZTIMESTAMP 值、ODBC 格式日期字符串或时间戳。

    日期表达式时间戳可以是数据类型 %Library.PosixTime(编码的 64 位有符号整数),也可以是数据类型 %Library.TimeStamp (yyyy-mm-dd hh:mm:ss.fff)。

    时间戳的时间部分不被评估,可以省略。

    使用 DATEPARTDATENAME 函数可以返回相同的星期信息。

    也可以使用 WEEK()方法调用从 ObjectScript 调用此函数:

    $SYSTEM.SQL.Functions.WEEK(date-expression)
    

    日期验证

    WEEK 对输入值执行以下检查。如果某个值未通过检查,则返回空字符串。

    • 日期字符串必须完整且格式正确,其中包含适当数量的元素和每个元素的数字,以及适当的分隔符。年份必须指定为四位数。
    • 日期值必须在有效范围内。年:0001 到 9999。月:1 到 12。日:1 到 31。
    • 一个月的天数必须与月份和年份相匹配。例如,日期“02–29”仅在指定年份是闰年时有效。
    • 小于 10 的日期值可以包括或省略前导零。不允许使用其他非规范整数值。因此,Day“07”“7”有效,但“007”“7.0”“7a”无效。

    示例

    以下嵌入式 SQL 示例返回 2005 年 1 月 2 日(星期日)和 2006 年 1 月 1 日(星期日)的星期几和一年中的星期几。

    /// d ##class(PHA.TEST.SQLFunction).Week()
    ClassMethod Week()
    {
        SET x = "2005-1-2"
        SET y = "2006-1-1"
        &sql(
            SELECT 
                {fn DAYOFWEEK(:x)},{fn WEEK(:x)},
                {fn DAYOFWEEK(:y)},{fn WEEK(:y)}
            INTO 
                :a,:b,:c,:d
        )
        if SQLCODE '= 0 {
            w !,"Error code ",SQLCODE 
        } else {
            w !,"2005 Day of Week is: ",a," (Sunday=1)"
            w " Week of Year is: ",b
            w !,"2006 Day of Week is: ",c," (Sunday=1)"
            w " Week of Year is: ",d 
        }
    }
    
    
    DHC-APP>d ##class(PHA.TEST.SQLFunction).Week()
     
    2005 Day of Week is: 1 (Sunday=1) Week of Year is: 2
    2006 Day of Week is: 1 (Sunday=1) Week of Year is: 1
    

    以下示例返回数字 9,因为日期是 2004 年的第九周:

    SELECT {fn WEEK('2004-02-25')} AS Wk_Date,
           {fn WEEK('2004-02-25 08:35:22')} AS Wk_Tstamp,
           {fn WEEK(59590)} AS Wk_DInt
           
           
    9   9   9
    

    以下示例返回数字 54,因为此特定日期是闰年,从第 2 周开始,从第二天开始,如紧随其后的示例所示:

    SELECT {fn WEEK('2000-12-31')} AS Week
    
    54
    
    SELECT {fn WEEK('2000-01-01')}||{fn DAYNAME('2000-01-01')} AS WeekofDay1,
           {fn WEEK('2000-01-02')}||{fn DAYNAME('2000-01-02')} AS WeekofDay2
           
           
           
    1Saturday   2Sunday
    

    以下示例均返回当前周:

    SELECT {fn WEEK({fn NOW()})} AS Wk_Now,
           {fn WEEK(CURRENT_DATE)} AS Wk_CurrD,
           {fn WEEK(CURRENT_TIMESTAMP)} AS Wk_CurrTS,
           {fn WEEK($HOROLOG)} AS Wk_Horolog,
           {fn WEEK($ZTIMESTAMP)} AS Wk_ZTS
           
           
    20  20  20  20  20
    

    以下嵌入式 SQL 示例显示了 默认的一年中的一周以及应用 ISO 8601 标准的一年中的一周:

    /// d ##class(PHA.TEST.SQLFunction).Week1()
    ClassMethod Week1()
    {
    TestISO
        s def = $d(^%SYS("sql","sys","week ISO8601"))
        if def = 0 {
            s ^%SYS("sql","sys","week ISO8601")=0
        } else {
            s isoval = ^%SYS("sql","sys","week ISO8601")
        }
        if isoval = 1 {
            g UnsetISO 
        } else {
            s isoval=0 
            g WeekOfYear 
        }
    UnsetISO
        s ^%SYS("sql","sys","week ISO8601") = 0
    WeekOfYear
        &sql(
            SELECT 
                {fn WEEK($HOROLOG)} 
            INTO 
                :a
        )
        w "For Today:",!
        w "default week of year is ",a,!
        s ^%SYS("sql","sys","week ISO8601") = 1
        &sql(
            SELECT 
                {fn WEEK($HOROLOG)} 
            INTO 
                :b
        )
        w "ISO8601 week of year is ",b,!
    ResetISO
        s ^%SYS("sql","sys","week ISO8601") = isoval
    }
    

    相关文章

      网友评论

        本文标题:第157章 SQL函数 WEEK

        本文链接:https://www.haomeiwen.com/subject/vetzprtx.html