# 第九十八章 SQL函数 MONTHNAME 返回日期表达式的月份名称的日期函数。 # 大纲 ```java {fn MONTHNAME(date-expression)} ``` # 参数 - `date-expression` - 计算结果为 日期整数、ODBC 日期或时间戳的表达式。此表达式可以是列名、另一个标量函数的结果或日期或时间戳字面量。 # 描述 `MONTHNAME` 将日期整数、`$HOROLOG` 或 `$ZTIMESTAMP` 值、`ODBC` 格式日期字符串或时间戳作为输入。 日期表达式时间戳可以是数据类型 `%Library.PosixTime`(编码的 64 位有符号整数),也可以是数据类型 `%Library.TimeStamp (yyyy-mm-dd hh:mm:ss.fff)`。 时间戳的时间部分不被评估,可以省略。 `MONTHNAME` 返回相应日历月的名称,从一月到十二月。返回值是一个字符串,最大长度为 15。 `MONTHNAME` 检查提供的日期是否有效。年份必须介于 `0001` 和 `9999`(含)之间、月份 `01` 至 `12` 以及适合该月的日期(例如,`02/29` 仅在闰年有效)。如果日期无效,`MONTHNAME` 会发出 `SQLCODE -400` ``错误。 月份名称默认为全长美式英语月份名称。要更改这些月份名称值,请使用带有 `MONTH_NAME` 选项的 `SET OPTION` 命令。 使用 `DATENAME` 函数可以返回相同的月份名称信息。可以使用 `TO_DATE `检索月份名称或月份名称缩写与其他日期元素。要返回与月份对应的整数,请使用 `MONTH DATEPART` 或 `TO_DATE`。 也可以使用 `MONTHNAME()` 方法调用从 ObjectScript 调用此函数: ```java $SYSTEM.SQL.Functions.MONTHNAME(date-expression) ``` # 示例 以下示例均返回字符串`“February”`,因为它是日期表达式的月份(`2018 年 2 月 22 日`): ```sql SELECT {fn MONTHNAME('2018-02-22')} AS NameOfMonth February ``` ```sql SELECT {fn MONTHNAME(64701)} AS NameOfMonth February ``` 以下示例均返回当前月份: ```sql SELECT {fn MONTHNAME({fn NOW()})} AS MnameNow, {fn MONTHNAME(CURRENT_DATE)} AS MNameCurrDate, {fn MONTHNAME(CURRENT_TIMESTAMP)} AS MNameCurrTS, {fn MONTHNAME($HOROLOG)} AS MNameHorolog, {fn MONTHNAME($ZTIMESTAMP)} AS MNameZTS March March March March March ``` 以下嵌入式 SQL 示例显示了 `MONTHNAME` 如何响应无效日期(`2017` 年不是闰年): ```java /// d ##class(PHA.TEST.SQLFunction).MonthName() ClassMethod MonthName() { s testdate = "2017-02-29" &sql( SELECT {fn MONTHNAME(:testdate)} INTO :a ) if SQLCODE '= 0 { w !,"Error code ",SQLCODE,! w %msg,! } else { w !,"returns: ",a } q } ``` ```java DHC-APP>d ##class(PHA.TEST.SQLFunction).MonthName() Error code -400 Unexpected error occurred: %0BCo+10^PHA.TEST.SQLFunction.1 ``` `SQLCODE -400` 错误代码与指示 `` 的 `%msg` 一起发出。