【问题标题】:How to convert a string in the format of mm/dd/yyyy to yyyy-mm-dd in T-SQLT-SQL中如何将mm/dd/yyyy格式的字符串转换为yyyy-mm-dd
【发布时间】:2016-06-30 06:25:31
【问题描述】:

我有一个日期以 mm/dd/yyyy 的形式存储一个字符串,该字符串被传递到 SQL Server SP 以插入数据库。如何将其转换为 yyyy-mm-dd 格式,以便 SQL Server 实际上将其正确插入到具有日期时间类型的列中?只是将其保留为字符串 mm/dd/yyyy 似乎没有做任何事情。

【问题讨论】:

  • 您可以尝试将字符串分解为单独的 yyyy、mm 和 dd 部分,然后以 yyyy-mm-dd 格式重新组合为另一个字符串。
  • CAST('MM/DD/YYYY' AS DATE)
  • @bjones 您的评论取决于文化!在我的德国机器上,这会坏掉......你可以看看我的回答......
  • @DeanOC,无需使用复杂的字符串拆分。 CONVERT 将使用适当的格式编号正确解析此格式...
  • @Amanda_Panda 我很惊讶它什么也没做。我要么期望它工作,要么给出一个错误。如果您遇到错误,请告诉我们,我们会告诉您这意味着什么。让我们查看您的代码也有助于我们回答您的问题。

标签: sql-server tsql datetime


【解决方案1】:

您应该尽可能避免依赖文化的日期格式。

看看这个:

DECLARE @StringDate VARCHAR(100)='06/29/2016';

SET LANGUAGE ENGLISH;
SELECT CAST(@StringDate AS DATE)

/*

Throws an exception!

SET LANGUAGE GERMAN;
SELECT CAST(@StringDate AS DATE)
*/

了解TSQL: CONVERT 及其格式。您的格式是数字 101:

SELECT CONVERT(DATE,@StringDate,101)

最好使用独立格式You might read this

【讨论】:

  • 同样重要的是要注意 'CAST' 是隐式的,而 'CONVERT' 是显式的。
  • 谢谢大家的回答,他们真的很有帮助!
【解决方案2】:

您可以使用 PARSE() 从文化特定格式创建 DATETIME 对象,然后将其转换为所需的字符串:

select convert(varchar(20), parse('02/15/2016' as datetime2 using 'en-US'), 20);

20 是 CONVERT() 的 ODBC 日期样式 (YYYY-mm-dd) 的特定代码。

【讨论】:

  • 当您使用 CONVERT 时,为什么不使用适当的 101 而不是额外的 PARSE 使用文化“en-US”来调用它?
  • 为了避免语言切换和 VARCHAR 字符串作为结果。还是我错过了什么?
  • 如何将其转换为 yyyy-mm-dd 格式,以便 SQL Server 将其正确插入到日期时间类型的列中无需重新转换为 varchar 类型...
  • 我错过了那个,我的错!谢谢。
【解决方案3】:

有多种方法可以做到这一点,这里有三种:

您可以预先设置DATEFORMAT 设置:

SET DATEFORMAT mdy;
INSERT INTO Table1 (DateCol) VALUES ('09/30/2016');

或者你可以使用CONVERT函数:

INSERT INTO Table1 (DateCol) VALUES (CONVERT(datetime, '09/30/2016', 101))

或者最后您可以使用PARSE 函数,这更灵活,因为它可以接受其他日期格式,例如“2016 年 9 月 30 日,星期五”,但显然要慢一些:

INSERT INTO Table1 (DateCol) VALUES (PARSE('09/30/2016' as datetime using 'en-US'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多