如何在阿拉伯语(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