Sql server 如何在T-SQL中将mm/dd/yyyy格式的字符串转换为yyyy-mm-dd

Sql server 如何在T-SQL中将mm/dd/yyyy格式的字符串转换为yyyy-mm-dd,sql-server,tsql,datetime,Sql Server,Tsql,Datetime,我有一个日期,它以mm/dd/yyyy的形式存储在一个字符串中,该字符串将被传递到SQL Server SP以插入数据库。如何将其转换为yyyy mm dd格式,以便SQL Server能够将其正确插入日期时间类型的列中?仅将其保留为字符串mm/dd/yyyy似乎没有任何作用。只要可能,您应该避免依赖于区域性的日期格式 看看这个: DECLARE @StringDate VARCHAR(100)='06/29/2016'; SET LANGUAGE ENGLISH; SELECT CAST(@

我有一个日期,它以mm/dd/yyyy的形式存储在一个字符串中,该字符串将被传递到SQL Server SP以插入数据库。如何将其转换为yyyy mm dd格式,以便SQL Server能够将其正确插入日期时间类型的列中?仅将其保留为字符串mm/dd/yyyy似乎没有任何作用。

只要可能,您应该避免依赖于区域性的日期格式

看看这个:

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)
*/
阅读和它的格式。您的格式是数字101:

SELECT CONVERT(DATE,@StringDate,101)
最好是使用独立格式

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

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

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

实现这一点的方法有三种:

您可以在手动之前设置设置:

SET DATEFORMAT mdy;
INSERT INTO Table1 (DateCol) VALUES ('09/30/2016');
或者您可以使用以下功能:

INSERT INTO Table1 (DateCol) VALUES (CONVERT(datetime, '09/30/2016', 101))
最后,您也可以使用该功能,该功能更灵活,因为它可以接受其他日期格式,如“2016年9月30日星期五”,但速度明显较慢:

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

您可以尝试将字符串拆分为单独的yyyy、mm和dd部分,并以yyyy-mm-dd格式重新组合为另一个字符串。
CAST('mm/dd/yyyy'作为日期)
@bjones您的评论取决于区域性!在我的德国机器上这会坏。。。你可以看看我的答案…@DeanOC,没有必要使用复杂的字符串拆分
CONVERT
将使用适当的格式编号正确解析此格式…@Amanda_Panda我很惊讶它没有做任何事情。我要么期望它工作,要么给出一个错误。如果您遇到错误,请告诉我们,我们将告诉您这意味着什么。让我们看看您的代码也可以帮助我们回答您的问题。因为您使用的是
CONVERT
为什么不使用相应的101来调用它,而不是使用文化“en-us”来调用额外的
PARSE
,以避免语言切换和VARCHAR字符串。或者我遗漏了什么?我如何将其转换为yyyy mm dd格式,以便SQL Server能够将其正确插入到具有日期时间类型的列中?我这样认为,不需要重新转换为varchar类型…我遗漏了该类型,我的错!谢谢。同样重要的是要注意“CAST”是隐式的,而“CONVERT”是显式的。谢谢大家的回答,他们真的很有帮助!