从字符串中提取年、月和日数字(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日
...
我想达到的目标:
- 我需要提取年份的前 4 位数字;
- 第一个字符(年)和第二个字符(月)之间的数字,从1到12(1或2位)的月份;
- 第二个字符(月)和第三个字符(日)之间的数字,表示一个月中从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"
我正在使用 LibreOffice Base(7.3 版)创建数据库。 我需要从包含中文字符的字符串中提取年、月和日数字,如下所示。我认为一个汉字就是一个汉字,但我不确定。
我有: 1997年8月12日 1971年10月1日 2001年5月26日 2005年12月29日 2010年2月8日 ...
我想达到的目标:
- 我需要提取年份的前 4 位数字;
- 第一个字符(年)和第二个字符(月)之间的数字,从1到12(1或2位)的月份;
- 第二个字符(月)和第三个字符(日)之间的数字,表示一个月中从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"