草庐IT

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

coder 2023-10-09 原文

我的问题实际上是我的最终目标。 到目前为止,我有 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 - 如何在阿拉伯(hijri)日历中执行 'between' 并在 MySQL 中将其保存为 'date'?的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  3. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  4. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  5. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  6. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  9. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  10. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

随机推荐