【问题标题】:SQL Server Convert 01 December 2016 to dateSQL Server 转换 2016 年 12 月 1 日至今
【发布时间】:2017-04-04 14:08:05
【问题描述】:

如何在 SQL Server 中将字符串“2016 年 12 月 1 日”转换为日期类型?

CONVERT(date, '01 December 2016', 106)

预计日期结果“2016 年 12 月 1 日”

【问题讨论】:

  • 您的代码有效。 SQL Server(正确)返回 2016-12-01,因为这是返回日期的格式。如果您想要不同的格式,请使用 convert(varchar()) 和适当的格式参数。或format().

标签: sql sql-server tsql date sql-convert


【解决方案1】:

如果 2012+ 可以使用 Format()

Select Format(convert(date,'01 December 2016'),'dd MMM yyyy')

返回

01 Dec 2016

【讨论】:

  • 像上面那样调用CONVERT 意味着依赖隐式的文化/语言转换。在我的系统上,这会中断。 +1 FORMAT()
【解决方案2】:

使用特定于文化的日期/时间格式非常危险,使用特定于语言和文化的格式更糟糕......

如果可能以适当的类型存储日期/时间值!

在我的(德国)系统中,由于“十二月”(在德国是“十二月”),直接转换或转换会中断。看看这个:

SET LANGUAGE English; --try the same with "German"

DECLARE @d VARCHAR(100)='01 December 2016';

SELECT CONVERT(VARCHAR(11),CONVERT(DATE,@d,106),106);

结果

01 Dec 2016

永远不要依赖隐式转换:Call CONVERT with the third parameter in any case!

第三个参数106 告诉SQL Server 日期的格式(如何解析它)。第一个CONVERTSs 目标类型是DATE。这 - 现在正确表示! - 日期可以再次转换为VARCHAR(11),将 106 作为第三个参数现在指定 输出格式

要更深入地了解特定语言的日期部分,您可以运行此查询:

SELECT * FROM sys.syslanguages;

顺便说一句:如果您使用的是 SQL Server 2012+,您应该调用 FORMAT(),正如 John Cappelletti 所指出的那样

【讨论】:

  • 更安全。令我感到羞耻的是,我倾向于对这些项目不敏感+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多