You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在SQL中直接存储波斯历格式的日期?

如何在SQL中直接存储波斯历格式的日期?

嘿,我来帮你理清这个问题!首先得明确一个核心点:SQL里的date类型本质上是基于公历(格里高利历)来存储日期数值的,它并不支持直接存储波斯历的日期格式——你看到的“存成公历”其实是因为这个类型本身就是用公历来表示日期值的,不是格式的问题,是底层存储逻辑的问题。

那怎么解决你的需求呢?给你两个可行的方向:

  • 推荐方案:转换后存储(兼顾查询和计算)
    既然SQL的date只认公历,那我们可以先把波斯历日期转换成对应的公历日期值,再存入数据库。这样既保留了SQL日期类型的所有优势(方便排序、加减、比较),后续查询的时候再转成波斯历显示就行。
    两种转换方式:

    1. 在.NET代码里转换:
      PersianCalendar类就能轻松搞定,比如你从DateTimePicker拿到波斯历的年、月、日之后,转成公历DateTime再插入:
      // 假设从DateTimePicker获取波斯历的年、月、日
      int persianYear = yourDateTimePicker.GetPersianYear(); // 替换成你实际获取的方法
      int persianMonth = yourDateTimePicker.GetPersianMonth();
      int persianDay = yourDateTimePicker.GetPersianDay();
      
      PersianCalendar pc = new PersianCalendar();
      DateTime gregorianDate = pc.ToDateTime(persianYear, persianMonth, persianDay, 0, 0, 0, 0);
      
      // 接下来把gregorianDate插入到SQL的date字段就可以了
      
    2. 在SQL层面写自定义函数转换:
      如果想在数据库端处理,你可以写一个自定义函数把波斯历的年、月、日转成公历date,比如SQL Server的例子:
      CREATE FUNCTION dbo.PersianToGregorian(@Year INT, @Month INT, @Day INT)
      RETURNS DATE
      AS
      BEGIN
          DECLARE @GregorianDate DATE;
          -- 利用SQL的Calendar转换功能
          SET @GregorianDate = CONVERT(DATE, SWITCHOFFSET(CONVERT(DATETIMEOFFSET, 
              CONVERT(VARCHAR, @Year) + '-' + CONVERT(VARCHAR, @Month) + '-' + CONVERT(VARCHAR, @Day) + ' 00:00:00'), 
              9)); -- 9是波斯历的Calendar ID
          RETURN @GregorianDate;
      END
      
      插入的时候直接调用这个函数:
      INSERT INTO YourTableName (YourDateColumn) VALUES (dbo.PersianToGregorian(1403, 5, 10))
      
  • 不推荐方案:直接存字符串
    如果你非要“直接存波斯历格式”,可以把数据库字段改成NVARCHAR类型,直接存像1403/05/10这样的字符串。但这种方式的问题很大:后续做日期排序、加减天数、范围查询都会非常麻烦,完全发挥不了数据库日期类型的优势,所以除非万不得已,别这么干。

总结一下:最好的做法还是先转成公历日期存入date字段,查询时再转回波斯历显示——这是兼顾功能和体验的最优解。

备注:内容来源于stack exchange,提问作者Daryush

火山引擎 最新活动