4

我有一个varchar(200)名为的列Submit_Date,我正在尝试将其转换为 MM/DD/YYYY 格式。当我这样做时,我收到以下错误:

消息 242,级别 16,状态 3,第 1 行
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

该表的样本数据为:

Submit_Date
-----------------------
27-09-2013 16:15:00 CST
30-09-2013 16:30:24 CST
27-09-2013 10:03:46 CST

我尝试了以下方法:

Select Convert(datetime,Submit_date,101) from dbo.Tickets
4

2 回答 2

12

你在这里犯了大约 15 项关于日期/时间的重大罪行。首先,快速回答:

DECLARE @x VARCHAR(200);

SELECT @x = '27-09-2013 16:15:00 CST'

SELECT CONVERT(CHAR(10),CONVERT(DATETIME,LEFT(@x,10),105),101);

下一个:

  1. 为什么你将日期/时间数据存储在varchar(200)列中?您知道任何人都可以在其中插入类似'09-27-2013'or'465-32-207floob'的值,对吗?如果您需要时区信息,您可以查看DATETIMEOFFSET数据类型(但请注意,它不支持 DST)。

  2. 你为什么要存储像这样的区域格式dd-mm-yyyy?如果第一个值是07-11-2013我不得不猜测您是指 7 月 11 日还是 11 月 7 日。如果您不打算正确使用并使用正确的日期/时间数据类型,为什么要使用让人猜测的字符串格式?使用明确的格式(例如yyyy-mm-ddThh:mm:ssZ.

  3. 同样,您为什么要输出不同的区域格式,例如mm/dd/yyyy?如果您输出'05/06/2013',您是否 100% 确信您的听众中的每个人都会知道您的意思是 5 月 6 日而不是 6 月 5 日?您的输出也应该是明确的。如果您绝对必须以某些区域性和不明确的格式进行格式化,请使用客户端的字符串格式化功能。例如,C# 具有.ToString()并且.Format()在使用 T-SQL 将永远是的字符串格式表示日期方面更加强大和高效。

于 2013-10-24T03:49:32.420 回答
1

尝试以下 SQL 查询以达到预期结果:

SELECT convert(varchar, convert(date, '27-09-2013 16:15:00', 105), 101) 
于 2019-03-12T07:15:56.950 回答