如何在SQL Server DateTimeOffset列存储回历日期?转换报错怎解决?
问题原因
直接执行Cast('1444-02-30' as DateTimeOffset)报错,是因为SQL Server默认按**公历(格里高利历)**校验日期,而公历二月最多29天,自然判定这个日期无效。但回历(伊斯兰历)的月份天数和公历不一样,二月确实可能有30天,所以得让SQL Server用回历规则来解析这个字符串。
可行解决办法
DateTimeOffset完全可以存储回历日期,只要用正确的函数指定回历解析规则就行,推荐用PARSE或TRY_PARSE:
- 如果确定所有遗留日期格式都合法,用
PARSE直接转换:
SELECT PARSE('1444-02-30' AS DateTimeOffset USING 'ar-SA')
ar-SA是沙特阿拉伯文化代码,对应回历解析规则。
- 如果遗留数据里可能有无效日期,用
TRY_PARSE避免报错,无效日期会返回NULL:
SELECT TRY_PARSE('1444-02-30' AS DateTimeOffset USING 'ar-SA')
额外提示
如果之后需要把存储的DateTimeOffset转回回历字符串展示,用FORMAT函数指定相同文化代码就行:
SELECT FORMAT(YourDateTimeOffsetColumn, 'yyyy-MM-dd', 'ar-SA') AS HijriDate
内容的提问来源于stack exchange,提问作者Simple Code
相关产品推荐
相关产品推荐

