前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL函数 TO_DATE(二)

SQL函数 TO_DATE(二)

作者头像
用户7741497
发布2022-08-01 17:07:14
1.4K0
发布2022-08-01 17:07:14
举报
文章被收录于专栏:hml_知识记录

SQL函数 TO_DATE(二)

一年中的某一天(DDD 格式)

可以使用 DDD 将一年中的某一天(自 1 月 1 日以来经过的天数)转换为实际日期。格式字符串 DDD YYYY 必须与由整数天数和四位数年份组成的相应 date_string 配对。 (与 DDD 一起使用时,两位数的年份必须指定为 RR(而不是 YY)。)格式字符串 DDD 默认为当前年份。经过的天数必须是 1 到 365 范围内的正整数(如果 YYYY 是闰年,则为 366)。四位数年份必须在标准 日期范围内:18419999DDDYYYY 格式元素可以按任意顺序指定;它们之间的分隔符是强制性的。以下示例显示了这一年中的一天的用法:

代码语言:javascript
复制
/// d ##class(PHA.TEST.SQLFunction).ToDate4()
ClassMethod ToDate4()
{
    NEW SQLCODE
    &sql(
        SELECT TO_DATE('2018:60','YYYY:DDD')
        INTO :a
    )
    if SQLCODE = 0 {
        w a," = ",$ZDATE(a,1,,4)    
    } else { 
        w "error:",SQLCODE 
    }
}
代码语言:javascript
复制
DHC-APP>d ##class(PHA.TEST.SQLFunction).ToDate4()
64708 = 03/01/2018

如果格式字符串同时包含 DDDDD 元素,则 DDD 元素占主导地位。这在以下示例中显示,该示例返回 2/29/2020(不是 12/31/2020):

代码语言:javascript
复制
/// d ##class(PHA.TEST.SQLFunction).ToDate4()
ClassMethod ToDate5()
{
    n SQLCODE
    &sql(
        SELECT TO_DATE('2020-12-31-60','YYYY-MM-DD-DDD')
        INTO :a
    )
    if SQLCODE = 0 {
        w a," = ",$ZDATE(a,1,,4)    
    } else { 
        w "error:",SQLCODE 
    }
}
代码语言:javascript
复制
DHC-APP>d ##class(PHA.TEST.SQLFunction).ToDate5()
65438 = 02/29/2020

TO_DATE 允许返回对应于一年中某一天的日期表达式。 TO_CHAR 允许返回与日期表达式对应的一年中的哪一天。

儒略历日期(J格式)

SQL中,儒略日可用于1840年12月31日之前的任何日期。因为在内部将这个日期表示为0,所以需要特殊的语法来表示更早的日期。为此,TO_DATE提供了“J”(或“J”)格式。儒略日转换将七位数的内部数值(儒略日计数)转换为显示格式或ODBC格式的日期。例如:

代码语言:javascript
复制
/// d ##class(PHA.TEST.SQLFunction).ToDate6()
ClassMethod ToDate6()
{
    n SQLCODE
    &sql(
        SELECT TO_DATE(2300000,'J')
        INTO :a
    )
    if SQLCODE = 0 {
        w a     
    } else { 
        w "error:",SQLCODE 
    }
}
代码语言:javascript
复制
DHC-APP>d ##class(PHA.TEST.SQLFunction).ToDate6()
1585-01-31

返回以下日期:1585–01–31(ODBC格式)或01/31/1585(显示格式)。儒略日计数1721424返回公元1年的1月1日(1–01–01)。儒略日计数,如1709980(亚克兴战役标志着罗马帝国在奥古斯都·凯撒统治下的开始)返回公元前(BC)日期,显示的年份前面有一个负号。

儒略日计数在内部总是表示为一个七位数,必要时带有前导零。TO_DATE允许输入不带前导零的儒略日计数。最大允许儒略日是5373484,它返回12/31/9999。允许的最小儒略日是0000001,它返回01/01/-4712(即BCE日期01/01/-4713)。任何超出此范围的值都会生成SQLCODE -400错误,其%msg值为“无效的儒略日值”。儒略日必须介于15373484之间。

注意:以下注意事项不应影响使用TO_CHARTO_DATE的日期和儒略日计数的相互转换。这可能会影响使用儒略日计数进行的一些计算。

1721424 (1/1/1) 之前的儒略日计数与其他软件实现兼容,例如 Oracle。它们与通常使用的 BCE 日期不同。正常使用中,没有Year 0;日期从 12/31/-11/1/1。在 Oracle 使用中,儒略日期 17210581721423 完全无效,并返回错误。这些儒略日期返回不存在的第 0 年作为占位符。因此,涉及 BCE 日期的计算必须调整一年以对应于常见用法。

另请注意,这些日期计数并未考虑公历改革(1582 年 10 月 15 日颁布,但直到 1752 年才在英国及其殖民地采用)引起的日期变化。

TO_DATE 允许返回对应于儒略日计数的日期表达式。 TO_CHAR 允许返回对应于日期表达式的儒略日计数,如以下示例所示:

代码语言:javascript
复制
SELECT 
  TO_CHAR('1776-07-04','J') AS JulianCount,
  TO_DATE(2369916,'J') AS JulianDate
  
  
2369916 1776/7/4 0:00:00

示例

默认日期格式示例

以下嵌入式 SQL 示例指定使用默认日期格式解析的日期字符串。这两个都转换为 DATE 数据类型内部值 60537

代码语言:javascript
复制
/// d ##class(PHA.TEST.SQLFunction).ToDate7()
ClassMethod ToDate7()
{
    NEW SQLCODE
    &sql(
        SELECT 
            TO_DATE('29 September 2018'),
            TO_DATE('29 SEP 2018')
        INTO :a,:b
    )
    IF SQLCODE=0 {WRITE a,!,b }
    ELSE { WRITE "error:",SQLCODE }
}

以下嵌入式 SQL 示例指定具有两位数年份的日期字符串,格式为默认值。请注意,两位数年份默认为 19001999。因此,内部 DATE 值为 24012

代码语言:javascript
复制
/// d ##class(PHA.TEST.SQLFunction).ToDate8()
ClassMethod ToDate8()
{
    NEW SQLCODE
    &sql(
        SELECT 
            TO_DATE('29 September 06'),
            TO_DATE('29 SEP 06')
        INTO :a,:b
    )
    IF SQLCODE=0 {WRITE a,!,b }
    ELSE { WRITE "error:",SQLCODE }
}

指定日期格式示例

以下嵌入式 SQL 示例以各种格式指定日期字符串。所有这些都转换为 DATE 数据类型内部值 64701

代码语言:javascript
复制
/// d ##class(PHA.TEST.SQLFunction).ToDate9()
ClassMethod ToDate9()
{
    NEW SQLCODE
    &sql(
        SELECT 
            TO_DATE('2018 Feb 22','YYYY MON DD'),
            TO_DATE('FEBRUARY 22, 2018','month dd, YYYY'),
            TO_DATE('2018***02***22','YYYY***MM***DD'),
            TO_DATE('02/22/2018','MM/DD/YYYY')
        INTO :a,:b,:c,:d
    )
    if SQLCODE = 0 {
        w !,a,!,b,!,c,!,d   
    } else { 
        w "error:",SQLCODE 
    }
}
代码语言:javascript
复制
DHC-APP>d ##class(PHA.TEST.SQLFunction).ToDate9()
 
64701
64701
64701
64701

以下嵌入式 SQL 示例指定不需要元素分隔符的日期格式。它们返回 64701 的日期内部值:

代码语言:javascript
复制
/// d ##class(PHA.TEST.SQLFunction).ToDate10()
ClassMethod ToDate10()
{
    NEW SQLCODE
    &sql(
        SELECT 
            TO_DATE('02222018','MMDDYYYY'),
            TO_DATE('22022018','DDMMYYYY'),
            TO_DATE('20182202','YYYYDDMM'),
            TO_DATE('20180222','YYYYMMDD')
        INTO :a,:b,:c,:d
    )
    if SQLCODE = 0 {
        w !,a,!,b,!,c,!,d   
    } else { 
        w "error:",SQLCODE 
    }
}
代码语言:javascript
复制
DHC-APP>d ##class(PHA.TEST.SQLFunction).ToDate10()
 
64701
64701
64701
64701

以下示例指定 YYYYMM 日期格式。它不需要元素分隔符。它为缺失的日期元素提供 01,返回日期 64800(2018 年 6 月 1 日):

代码语言:javascript
复制
/// d ##class(PHA.TEST.SQLFunction).ToDate11()
ClassMethod ToDate11()
{
    NEW SQLCODE
    &sql(
        SELECT TO_DATE('201806','YYYYMM')
        INTO :a 
    )
    if SQLCODE = 0 {
        w a," = ",$ZDATE(a,1,,4) 
    } else { 
        w "error:",SQLCODE 
    }
}
代码语言:javascript
复制
DHC-APP>d ##class(PHA.TEST.SQLFunction).ToDate11()
64800 = 06/01/2018

本文系转载,前往查看

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

本文系转载前往查看

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SQL函数 TO_DATE(二)
    • 一年中的某一天(DDD 格式)
      • 儒略历日期(J格式)
      • 示例
        • 默认日期格式示例
          • 指定日期格式示例
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档