从字符串中提取年、月和日数字(1 到 2 位数字)(LibreOffice Base)

Extract year, month and day numbers (1 to 2 digits) from a string (LibreOffice Base)

我正在使用 LibreOffice Base(7.3 版)创建数据库。 我需要从包含中文字符的字符串中提取年、月和日数字,如下所示。我认为一个汉字就是一个汉字,但我不确定。

我有: 1997年8月12日 1971年10月1日 2001年5月26日 2005年12月29日 2010年2月8日 ...

我想达到的目标:

  1. 我需要提取年份的前 4 位数字;
  2. 第一个字符(年)和第二个字符(月)之间的数字,从1到12(1或2位)的月份;
  3. 第二个字符(月)和第三个字符(日)之间的数字,表示一个月中从1到31(1或2位)的天数;

我是新手,我尝试使用组合 RIGHT() 和 LEFT() 函数或 substring() 方法但我失败了,因为月数和天数有时是 1 位数字,有时是 2 位数字。如果有人可以提供帮助,我将不胜感激。非常感谢。

很遗憾,您没有指定您正在使用哪个 built-in 数据库,Firebird 还是 HSQLDB。

您没有提供您的 table 姓名和中文日期字段名称。因此,我将展示如何为 Firebird 数据库解决这个问题,一个名为 ChinaTest 的 table 和一个名为 ChinaDate 的字段。

首先,将前两个字符替换为破折号,将最后一个字符替换为空字符串(删除即可)。这将由 REPLACE() function 完成。只需将三个 REPLACE() 嵌套在另一个中:

REPLACE( REPLACE( REPLACE( "ChinaTest"."ChinaDate", '年', '-' ), '月', '-' ), '日', '' )

现在 CAST() function 可以轻松地将此字符串转换为“真实日期”:

SELECT CAST( <previous_expression> AS DATE ) "RealDate" FROM "ChinaTest"

当你有一个真正的约会时,你可以使用 EXTRACT() function 来获取它的任何部分。

最终解决方案可能如下所示:

SELECT "RealDate", EXTRACT( YEAR FROM "RealDate" ) "iYear", 
                   EXTRACT( MONTH FROM "RealDate" ) "iMonth", 
                   EXTRACT( DAY FROM "RealDate" ) "iDay" 
    FROM (SELECT CAST( 
                   REPLACE( 
                      REPLACE( 
                         REPLACE( "ChinaTest"."ChinaDate", '年', '-' ), 
                      '月', '-' ), 
                   '日', '' ) 
                  AS DATE ) "RealDate" FROM "ChinaTest")

对于 HSQLDB 数据库,查询可能如下所示:

SELECT
 CAST( REPLACE( REPLACE( REPLACE( "Employess"."CNBirthDate", '年', '-' ), '月', '-' ), '日', '' ) AS DATE ) AS "BDate",
 YEAR( CAST( REPLACE( REPLACE( REPLACE( "Employess"."CNBirthDate", '年', '-' ), '月', '-' ), '日', '' ) AS DATE ) ) AS "BDYear",
 MONTH( CAST( REPLACE( REPLACE( REPLACE( "Employess"."CNBirthDate", '年', '-' ), '月', '-' ), '日', '' ) AS DATE ) ) AS "BDMonth",
 DAY( CAST( REPLACE( REPLACE( REPLACE( "Employess"."CNBirthDate", '年', '-' ), '月', '-' ), '日', '' ) AS DATE ) ) AS "BDDay" 
FROM "Employess"