【问题标题】:Localized month names in FirebirdFirebird 中的本地化月份名称
【发布时间】:2011-05-27 21:16:29
【问题描述】:

我需要获取 TIMESTAMP 字段的各个部分 - 特别是 年份本地化月份名称(俄语)、月份中的某天小时间隔(如“11 - 12”)。

目前我想出了这个:

select
extract (year from prt.dtbegin) as f_year,
(
  case extract (month from prt.dtbegin)
    when 1 then 'Январь'
    when 2 then 'Февраль'
    /* ... */
    when 12 then 'Декабрь'
  end
) as f_month,
cast (lpad (extract (day from prt.dtbegin), 2, 0) as char(2)) as f_day,
(
  cast (lpad (extract (hour from prt.dtbegin), 2, 0) as char(2)) 
  || ' - '
  || cast (lpad (extract (hour from prt.dtbegin) + 1, 2, 0) as char(2)) 
) as f_hour
from prt

它工作得很好(目前间隔'23 - 24'还可以),但我不喜欢它,尤其是每个月的CASE句子。

所以,我想知道,在 Firebird 中获取本地化月份名称有什么常用方法吗?另外,我可以格式化提取的时间戳部分,而不是当前的 cast-lpad-extract 构造吗?

提前致谢。

【问题讨论】:

  • 这里的第一个问题,不知道所有的代码格式都去哪里了,在预览中看起来很好
  • 我已发布建议的编辑格式化您的代码。获取格式的最快方法是选择代码,然后按问题框顶部的 {} 按钮。
  • 您的应用程序编程语言是什么?德尔福、C++、Perl?该语言可能有一个库可以满足您的需求,例如 Perl 中的 DateTime::Locale
  • 当然有,但我想直接从查询中获取这些名称。

标签: sql timestamp firebird


【解决方案1】:

如果引用表中包含本地化字符串以及月份编号的键,那又如何呢?我认为这是在 Firebird 系统表中完成的,但无法在系统表中找到文档或位置(如果确实存在)。

编辑: 我检查了系统表和文档,而 Firebird 本身没有文字。对不起:-)

【讨论】:

  • 是的,我考虑过添加一个参考表,但我不想因为这个特定的查询而改变数据库。我认为有某种我不知道的内置功能会让它看起来不那么难看:)
【解决方案2】:

您可以使用 DECODE 内置函数代替 CASE:http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-decode.html

【讨论】:

    【解决方案3】:

    我认为没有内置功能。您应该考虑为此编写自己的 UDF。完成后,使用起来非常简单。以下资源应为您指明正确的方向:

    我当然希望下一个主要版本 (3.0) 将支持编写内部函数。

    更新

    Firebird 3.0 支持内部 SQL 函数:http://tracker.firebirdsql.org/browse/CORE-2047

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多