java - 如何在阿拉伯(hijri)日历中执行 'between' 并在 MySQL 中将其保存为 'date'?

标签 java mysql date internationalization hijri

我的问题实际上是我的最终目标。 到目前为止,我有 2 个问题。

  1. 如何在 mysql 中将阿拉伯语日期保存为“日期”? 因为,我一直在将 Gregorian 转换为 Hijri,然后使用 preg_replace(php,目前,final 在 Java 中)将数字更改为 arabic ascii hex...然后,将其作为 varchar 保存在 MySQL 中。

我知道排序规则 cp1256_general_ci 允许我们以阿拉伯语存储,但目前,为了简单起见,我将其放在一边。 utf-8_general 也很好。因此,存储为 varchar 不是问题,存储为“日期”才是问题。

  1. 对其执行查询。 我认为要求到此为止,但现在的任务是执行诸如“介于”xyz 和 pqr 之间的日期之类的查询...此外,约束是“仅以阿拉伯语存储”。

非常感谢任何意见。

最佳答案

SQL 日期

我会这样想:服务器实际上存储了一个日期作为给定日期的引用。它是如何做到的与您无关。将数据存储到此类日期列或从此类日期列读取数据时,服务器使用特定日历表示该日期,按照惯例,该日历为公历。我想说的是,我不会将存储 值视为公历,尽管它很可能是。我宁愿将转移日期视为公历。

因此,在我看来,最好的解决方案是接受这一事实并在应用程序方面在公历和回历之间进行转换。这样,您就可以对其使用正常的 between 检查。

由数字组成的字符串

如果这是不可能的,因为依赖于语言环境的转换太复杂,或者因为回历和 Grogorian 之间的映射不是唯一的或事先不知道,那么你将不得不将日期存储在一些其他形式。我想到的可能形式是 varchar,其中包含 YYYY-MM-DD 形式的字符串,其中字母表示数字。此方案确保字符串会像它们所代表的日期一样进行比较,因此您仍然可以对它们使用 between。不过,将这些字符串转回拼写出来的日期仍然很棘手。

一个或多个数字列

所以我实际上建议你使用三列,每列包含一个表示日期的数字,然后你可以使用 10000*year + 100*month + day_of_month 来获取每一天的单个数字,您可以将其用于比较和 between。另一方面,您可以使用函数 ELT在您的查询中将月份的数字变回名称。如果性能是一个问题,您最好只存储一个数字,并在选择时将其分成几部分。在公历中,这看起来像这样:

CREATE TABLE tableName (myDate DECIMAL(8));

SELECT myDate DIV 10000 AS year,
       ELT((myDate DIV 100) MOD 100, "Jan", "Feb", …) AS month,
       myDate MOD 100 AS day_of_month
FROM tableName
WHERE myDate BETWEN 20121021 AND 20121023;

兼容性和便利性

如果您必须与需要单个文本日期列的代码保持只读兼容性,您可以使用 VIEW提供那个。例如,对于德国公历 DD。 MMMM YYYY 格式,你可以使用这样的代码:

CREATE VIEW compatibleName AS
SELECT CONCAT(myDate MOD 100, ". ",
              ELT((myDate DIV 100) MOD 100, "Januar", "Februar", …), ". ",
              myDate DIV 10000) as dateString,
       * -- or explicitely name other columns needed for compatibility
FROM tableName

解码字符串

如果您需要其他应用程序使用字符串格式进行读写访问,您必须自己解析这些字符串。您可以在 SQL 级别执行此操作。有用的工具是 SUBSTRING_INDEX将字符串拆分为字段和 FIELD将月份名称转换为数字。您可能想向数据库添加一个触发器,以确保您的字符串始终采用有效格式,您可以通过这种方式进行分解。 This question详细介绍了如何使用触发器来执行此类检查。

关于java - 如何在阿拉伯(hijri)日历中执行 'between' 并在 MySQL 中将其保存为 'date'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13005165/

相关文章:

java - 在java中,Date()方法返回一个值。但我对此感到困惑

java - 从支持 bean 中关闭 JSP 弹出窗口?

mysql - 表之间有空格的 SELECT 语句?

mysql - Heroku 部署错误 :connection refused

mysql - 获取插入行的日期 MySQL

mysql - 使用 mysql 进行日期重叠以进行预订

java - 还有其他创建 servlet 实例的方法吗?

java - 如何在 BIRT API 中设置 Excel 工作表名称?

java - 在数组 Class[] 的声明中找不到符号

java - 无法解析的日期,以冒号分隔时区