在 SQL Server 中将 varchar 转换为日期时间

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1509977/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-01 03:51:10  来源:igfitidea点击:

Convert varchar into datetime in SQL Server

sqlsql-serversql-server-2008tsqltype-conversion

提问by Developer

How do I convert a string of format mmddyyyyinto datetimein SQL Server 2008?

如何将格式字符串转换mmddyyyydatetimeSQL Server 2008 中的格式?

My target column is in DateTime

我的目标列在 DateTime

I have tried with Convertand most of the Datestyle values however I get an error message:

我已经尝试过Convert大多数Date样式值,但是我收到一条错误消息:

'The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.'

“将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。”

回答by KM.

OP wants mmddyy and a plain convert will not work for that:

OP 需要 mmddyy,而简单的转换将不起作用:

select convert(datetime,'12312009')

Msg 242, Level 16, State 3, Line 1 
The conversion of a char data type to a datetime data type resulted in 
an out-of-range datetime value

so try this:

所以试试这个:

DECLARE @Date char(8)
set @Date='12312009'
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2))

OUTPUT:

输出:

-----------------------
2009-12-31 00:00:00.000

(1 row(s) affected)

回答by nick

SQL Server can implicitly cast strings in the form of 'YYYYMMDD' to a datetime - all other strings must be explicitly cast. here are two quick code blocks which will do the conversion from the form you are talking about:

SQL Server 可以将 'YYYYMMDD' 形式的字符串隐式转换为日期时间 - 所有其他字符串必须显式转换。这是两个快速代码块,它们将从您正在谈论的表单进行转换:

version 1 uses unit variables:

版本 1 使用单位变量:

BEGIN 
DECLARE @input VARCHAR(8), @mon CHAR(2), 
@day char(2), @year char(4), @output DATETIME

SET @input = '10022009'   --today's date


SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4)

SELECT @output = @year+@mon+@day 
SELECT @output 
END

version 2 does not use unit variables:

版本 2 不使用单位变量:

BEGIN 
DECLARE @input CHAR(8), @output DATETIME
SET @input = '10022009' --today's date 

SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2)

SELECT @output
END

Both cases rely on sql server's ability to do that implicit conversion.

这两种情况都依赖于 sql server 进行隐式转换的能力。

回答by Stephen Himes

I found this helpful for my conversion, without string manipulation. https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

我发现这对我的转换很有帮助,无需进行字符串操作。https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

CONVERT(VARCHAR(23), @lastUploadEndDate, 121)

yyyy-mm-dd hh:mi:ss.mmm(24h) was the format I needed.

yyyy-mm-dd hh:mi:ss.mmm(24h) 是我需要的格式。

回答by HLGEM

Likely you have bad data that cannot convert. Dates should never be stored in varchar becasue it will allow dates such as ASAP or 02/30/2009. Use the isdate() function on your data to find the records which can't convert.

您可能有无法转换的错误数据。日期不应存储在 varchar 中,因为它允许诸如 ASAP 或 02/30/2009 之类的日期。对您的数据使用 isdate() 函数来查找无法转换的记录。

OK I tested with known good data and still got the message. You need to convert to a different format becasue it does not know if 12302009 is mmddyyyy or ddmmyyyy. The format of yyyymmdd is not ambiguous and SQL Server will convert it correctly

好的,我使用已知的良好数据进行了测试,但仍然收到消息。您需要转换为不同的格式,因为它不知道 12302009 是 mmddyyyy 还是 ddmmyyyy。yyyymmdd 的格式没有歧义,SQL Server 会正确转换

I got this to work:

我得到了这个工作:

cast( right(@date,4) + left(@date,4) as datetime)

You will still get an error message though if you have any that are in a non-standard format like '112009' or some text value or a true out of range date.

但是,如果您有任何非标准格式(如“112009”或某些文本值或真正超出范围的日期),您仍会收到错误消息。

回答by Andrew

Convert would be the normal answer, but the format is not a recognised format for the converter, mm/dd/yyyy could be converted using convert(datetime,yourdatestring,101) but you do not have that format so it fails.

Convert 将是正常的答案,但该格式不是转换器可识别的格式,mm/dd/yyyy 可以使用 convert(datetime,yourdatestring,101) 进行转换,但您没有该格式,因此它失败了。

The problem is the format being non-standard, you will have to manipulate it to a standard the convert can understand from those available.

问题是格式是非标准的,您必须将其操作为转换可以从可用格式中理解的标准。

Hacked together, if you can guarentee the format

一起破解,如果你能保证格式

declare @date char(8)
set @date = '12312009'
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112)

回答by JonH

Look at CAST/ CONVERTin BOL that should be a start.

在 BOL 中查看CAST/CONVERT应该是一个开始。

If your target column is datetimeyou don't need to convert it, SQL will do it for you.

如果您的目标列是datetime您不需要转换它,SQL 会为您做。

Otherwise

除此以外

CONVERT(datetime, '20090101')

Should do it.

应该做。

This is a linkthat should help as well:

这是一个也应该有帮助的链接

回答by Shnugo

I'd use STUFFto insert dividing chars and then use CONVERTwith the appropriate style. Something like this:

我会STUFF用来插入分隔字符,然后使用CONVERT适当的样式。像这样的东西:

DECLARE @dt VARCHAR(100)='111290';
SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3)

First you use two times STUFFto get 11/12/90 instead of 111290, than you use the 3to convert this to datetime(or any other fitting format: use .for german, -for british...) More details on CAST and CONVERT

首先,您使用两次STUFF获得 11/12/90 而不是 111290,然后使用3将其转换为datetime(或任何其他合适的格式:.用于德语,-用于英国...)更多详细信息CAST and CONVERT

Best was, to store date and time values properly.

最好的是,正确存储日期和时间值。

  • This should be either "universal unseparated format" yyyyMMdd
  • or (especially within XML) it should be ISO8601: yyyy-MM-ddor yyyy-MM-ddThh:mm:ssMore details on ISO8601

Any culture specific format will lead into troubles sooner or later...

任何特定于文化的格式迟早都会导致麻烦......

回答by Shahab J

use Try_Convert:Returns a value cast to the specified data type if the cast succeeds; otherwise, returns null.

use Try_Convert:如果转换成功,则返回转换为指定数据类型的值;否则,返回 null。

DECLARE @DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,@DateString)

SET @DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,@DateString)

Link:MSDN TRY_CONVERT (Transact-SQL)

链接:MSDN TRY_CONVERT (Transact-SQL)

回答by Ryan

I had luck with something similar:

我很幸运有类似的事情:

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))

回答by Denis Maslov

The root cause of this issue can be in the regional settings - DB waiting for YYYY-MM-DD while an app sents, for example, DD-MM-YYYY (Russian locale format) as it was in my case. All I did - change locale format from Russian to English (United States) and voilà.

此问题的根本原因可能在于区域设置 - 数据库在应用程序发送时等待 YYYY-MM-DD,例如,DD-MM-YYYY(俄罗斯语言环境格式),就像我的情况一样。我所做的一切 - 将区域设置格式从俄语更改为英语(美国),瞧。