我需要在SQL Server中將字符串轉換爲基於.net DateTime類型的不同文化格式的日期時間。我可以使用SQL Server parse函數輕鬆實現大多數文化。如何使用Parse功能控制日曆系統?
SELECT
PARSE(N'4/22/1996 11:00:00 PM' AS DATETIME USING 'en-US'),
PARSE(N'6/7/2016' AS DATETIME USING 'en-US'),
PARSE(N'1/2/2016' AS DATETIME USING 'en-US'),
PARSE(N'2/1/2016' AS DATETIME USING 'en-US'),
PARSE(N'1:00:00 AM' AS DATETIME USING 'en-US')
輸出:
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+
| 1996-04-22 23:00:00.000 | 2016-06-07 00:00:00.000 | 2016-01-02 00:00:00.000 | 2016-02-01 00:00:00.000 | 2016-12-05 01:00:00.000 |
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+
對於文化,都沒有,默認情況下,基於公曆系統我無法弄清楚如何告訴解析funtion使用的日曆系統。
例如,對於ar-SA
,默認日曆系統是hijri。我可以爲沿與日期是回曆日期使用parse功能:
SELECT
PARSE(N'05/12/16 11:00:00 م' AS DATETIME USING 'ar-SA'),
PARSE(N'02/09/37' AS DATETIME USING 'ar-SA'),
PARSE(N'22/03/37' AS DATETIME USING 'ar-SA'),
PARSE(N'22/04/37' AS DATETIME USING 'ar-SA'),
PARSE(N'01:00:00 ص' AS DATETIME USING 'ar-SA')
輸出:
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+
| 1996-04-22 23:00:00.000 | 2016-06-07 00:00:00.000 | 2016-01-02 00:00:00.000 | 2016-02-01 00:00:00.000 | 2016-12-05 01:00:00.000 |
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+
不過,我已經在ar-SA
格式化的字符串使用Gregorian日曆系統。
當我嘗試使用解析函數
SELECT
PARSE(N'22/04/1996 11:00:00 م' AS DATETIME USING 'ar-SA'),
PARSE(N'07/06/2016' AS DATETIME USING 'ar-SA'),
PARSE(N'02/01/2016' AS DATETIME USING 'ar-SA'),
PARSE(N'01/02/2016' AS DATETIME USING 'ar-SA'),
PARSE(N'01:00:00 ص' AS DATETIME USING 'ar-SA')
將它們轉換我收到以下錯誤:
Error converting string value '22/04/1996 11:00:00 م' into data type datetime using culture 'ar-SA'.
但我需要一種方法來告訴解析字符串日期時間是什麼日曆系統在所以我得到預期的輸出:
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+
| 1996-04-22 23:00:00.000 | 2016-06-07 00:00:00.000 | 2016-01-02 00:00:00.000 | 2016-02-01 00:00:00.000 | 2016-12-05 01:00:00.000 |
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+
有沒有辦法調用解析函數並告訴SQL Server與文化一起使用哪個日曆系統?
更新
轉換不起作用。它不處理阿拉伯am/pm指定,也採用hijri日曆系統。
SELECT
CONVERT(datetime, N'22/04/1996 11:00:00 م', 131),
CONVERT(datetime, N'07/06/2016', 131),
CONVERT(datetime, N'02/01/2016', 131),
CONVERT(datetime, N'01/02/2016', 131),
CONVERT(datetime, N'01:00:00 ص', 131)
輸出:
Conversion failed when converting date and/or time from character string.
當非aribic AM PM名稱仍然使用Hijiri日曆系統
SELECT
CONVERT(datetime, N'22/04/1996 11:00:00 pm', 131),
CONVERT(datetime, N'07/06/2016', 131),
CONVERT(datetime, N'02/01/2016', 131),
CONVERT(datetime, N'01/02/2016', 131),
CONVERT(datetime, N'01:00:00 am', 131)
這導致日期是完全地錯了:
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+
| 2558-06-10 23:00:00.000 | 2577-12-18 00:00:00.000 | 2577-07-18 00:00:00.000 | 2577-08-16 00:00:00.000 | 1900-01-01 01:00:00.000 |
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+
對於那些你們誰不明白[Hijiri日曆]之間的差值(https://en.wikipedia.org/wiki/Islamic_calendar)和[公曆日曆](https://en.wikipedia.org/wiki/Gregorian_calendar)請在回答之前做一些調查。日期不僅以不同的格式表示,而且相同的時間點以不同的值表示。 –