gpt4 book ai didi

sql-server - 使用Parse函数时如何控制日历系统?

转载 作者:行者123 更新时间:2023-12-04 18:28:43 24 4
gpt4 key购买 nike

我需要在 SQL Server 中将字符串转换为基于 .net DateTime 的不同文化格式的日期时间。类型。对于大多数文化,我可以使用 SQL Server 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 |
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+

对于默认情况下不基于公历系统的文化,我不知道如何告诉 Parse 函数要使用哪个日历系统。

例如,对于 ar-SA , 默认日历系统是 hijri 。只要日期是回历日期,我就可以使用解析函数:

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 使用哪个日历系统以及文化?

更新

转换不起作用。它不处理阿拉伯语上午/下午名称,还采用回历系统。

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.

当非阿拉伯语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 |
+-------------------------+-------------------------+-------------------------+-------------------------+-------------------------+

最佳答案

有没有办法调用解析函数并告诉 SQL Server 哪个日历系统与文化一起使用?否,但您可以将语言更改为 'British' 以切换到公历。

我无法用阿拉伯语 am/pm 解析公历日期,所以所有这些都用 am/pm 代替了它。

例如:http://rextester.com/ZVAG17162

if exists (select * from tempdb.sys.objects where name like '#Hijri%') begin; drop table #Hijri; end;
create table #Hijri (strIn nvarchar(32)
, amPm nvarchar(32))
/* Hijri Format & Gregorian Calendar */ insert into #Hijri (strIn) values (N'22/04/1996 11:00:00 م'),(N'07/06/2016'),(N'02/01/2016'),(N'01/02/2016'),(N'01:00:00 ص')
/* Hijri Format & Hijri Calendar */ --insert into #Hijri (strIn) values (N'05/12/16 11:00:00 م') ,(N'02/09/37') ,(N'22/03/37') ,(N'22/04/37') ,(N'01:00:00 ص')
update #Hijri set amPm = replace(replace(strIn,N' م',N' pm'),N' ص',N' am');
--set language 'Arabic'; /* implies Hijri Calendar */
--set language 'English'; /* implies Gregorian Calendar & implicitly sets dateformat mdy */
set language 'British'; /* implies Gregorian Calendar & implicitly sets dateformat dmy */
--set dateformat mdy; /* requires style 103 on convert, overrides language default */
--set dateformat dmy; /* does not require style 103 on convert, overrides language default */

select
strIn
, amPm
, GregorianCalendarDateTime =convert(datetime2(2),amPm,103)
--/* -- requires: set language 'British'; -- or other gregorian calendar culture -- else converts to Hijri Calendar
, HijriFormatGregorianCalendar =replace(replace(
format(convert(datetime2(2),amPm,103), N'dd/MM/yyyy hh:mm:ss tt')
,N' PM',N' م'),N' AM',N' ص') --*/
, HijriFormatHijriCalendar =format(convert(datetime2(2),amPm,103), N'dd/MM/yyyy hh:mm:ss tt', 'ar-SA' )
, HijriCalendarDateString =convert(nvarchar(32),convert(datetime2(2),amPm,103),131)
--/* -- requires: set language 'Arabic' or 'British'; or set dateformat dmy;
, HijriCalendarDateTime =convert(datetime2(2),(convert(nvarchar(32),convert(datetime2(2),amPm,103),131)),103) --*/
from #Hijri;

对评论的回应:“只是想知道你是否有一个链接,你可以指出日历系统无法控制?”data、datetime、datetime2 和 datetimeoffset 数据类型不存储变量日历类型,它们是公历。当您看到回历日期时间时,您看到的是一种应用于 8 字节日期时间值(或 x 字节 datetime2 值)的格式。

sql server datetime data type 的引用链接和 sql server datetime2 data type

即使是 DateTime in .NET Framework 4.6.2正在使用公历。

// This value type represents a date and time.  Every DateTime 
// object has a private field (Ticks) of type Int64 that stores the
// date and time as the number of 100 nanosecond intervals since
// 12:00 AM January 1, year 1 A.D. in the proleptic Gregorian Calendar.

.NET 框架 DateTime Constructor仅采用日历参数来解释年、月和日。

当您使用 parse 时带有 culture 参数,用于标识表示日期时间值的字符串值的格式。它以与 convert 相同的方式使用它采用确定字符串值的标准(格式)的样式参数。专门针对阿拉伯文化“ar-SA”和样式 130 和 131,SQL Server 使用 Kuwaiti algorithm .

关于sql-server - 使用Parse函数时如何控制日历系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40980568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com