数据库
首页 > 数据库> > 如何在阿拉伯语(hijri)日历中执行’between’并将其保存为MySQL中的’date’?

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

作者:互联网

我的问题实际上是我的终极目标.
到目前为止,我有两个问题.

>如何在mysql中将阿拉伯语日期保存为“日期”?
因为,我一直在将Gregorian转换为Hijri然后,使用preg_replace(php,现在,final是Java)会将数字更改为阿拉伯语ascii hex …然后,将它作为varchar保存在MySQL中.

我知道整理cp1256_general_ci,它允许我们存储在阿拉伯语中,但是,目前,为了简单起见,我把它放在一边. utf-8_general也做得很好.因此存储为varchar不是问题,存储为’date’即可.

>对它执行查询.
我认为要求会在那里结束但是,现在的任务是在’xyz和pqr之间执行日期’之类的查询…此外,约束是’仅将其存储在阿拉伯语中’.

任何投入都非常感谢.

解决方法:

SQL日期

我会这样想:服务器实际上存储一个日期作为给定日期的引用.这是怎么做的,不关心你的.当向这样的日期列存储数据或从这样的日期列读取数据时,服务器使用特定日历来表示该日期,该日历按照惯例是格里高利的.我想说的是,我不会认为存储的值是格里高利,尽管很可能.我宁愿把转移的日期视为格里高利.

因此,在我看来,最好的解决方案是接受这个事实,并在应用程序方面在Gregorian和Hijri之间进行转换.这样,您可以在检查之间使用正常.

字符串由数字组成

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

一个或多个数字列

所以我实际上建议你使用三列.每个列都包含一个表示日期的数字.然后你可以使用10000 *年100 *月day_of_month来获取每天的一个数字,你可以用它来进行比较.另一方面,您可以在查询中使用函数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,mysql,date,internationalization,hijri
来源: https://codeday.me/bug/20190529/1181128.html