188

我试图按如下方式创建一个表,

create table table1(date1 datetime,date2 datetime);

首先,我尝试插入如下值,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

它给出了错误说,

无法将 varchar 转换为日期时间

然后我尝试了以下格式作为我们的stackoverflow建议的帖子之一,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

但是我仍然收到错误消息,

从字符串转换日期和/或时间时转换失败

有什么建议么?

4

17 回答 17

192

SQL Server 支持多种格式 - 请参阅有关 CAST 和 CONVERT 的 MSDN 联机丛书。这些格式中的大多数取决于您拥有的设置 - 因此,这些设置有时可能有效 - 有时无效。

解决此问题的方法是使用 SQL Server 支持的(稍作调整的)ISO-8601 日期格式- 这种格式始终有效- 无论您的 SQL Server 语言和日期格式设置如何。

SQL Server 支持的ISO-8601 格式有两种形式:

  • YYYYMMDD仅适用于日期(无时间部分);注意这里:没有破折号!,这很重要!YYYY-MM-DD不独立于 SQL Server 中的日期格式设置,并且不会所有情况下工作!

或者:

  • YYYY-MM-DDTHH:MM:SS对于日期和时间 - 请注意:这种格式破折号(但可以省略),并且TDATETIME.

这对 SQL Server 2000 和更新版本有效。

因此,在您的特定情况下 - 使用这些字符串:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

你应该没问题(注意:你需要使用国际24 小时格式而不是 12 小时 AM/PM 格式)。

或者:如果您使用的是 SQL Server 2008或更高版本,您也可以使用DATETIME2数据类型(而不是 plain DATETIME),并且您的当前INSERT将正常工作而没有任何问题!:-)DATETIME2在转换上要好得多,也不那么挑剔——无论如何,它是 SQL Server 2008 或更新版本的推荐日期/时间数据类型。

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

不要问我为什么整个话题如此棘手和令人困惑——事情就是这样。但是使用该YYYYMMDD格式,您应该适用于任何版本的 SQL Server 以及 SQL Server 中的任何语言和日期格式设置。

于 2013-01-02T08:51:40.790 回答
36

SQL server 中的转换有时不是因为使用的日期或时间格式而失败,而仅仅是因为您试图存储系统无法接受的错误数据。

例子:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

SQL 服务器将抛出以下错误:

Conversion failed when converting date and/or time from character string.

此错误的原因只是年份(2015 年)没有这样的日期(2 月 29 日)。

于 2015-06-06T20:18:34.097 回答
19

简单的答案 - 5 是意大利语“yy”,105 是意大利语“yyyy”。所以:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

将正常工作,但

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

会报错。

同样地,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

将给出错误,其中

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

将工作。

于 2013-01-02T09:01:07.613 回答
10

只要有可能,应避免使用特定于文化的日期/时间文字

有一些安全格式可以将日期/时间作为文字提供:

所有示例2016-09-15 17:30:00

ODBC(我最喜欢的,因为它立即作为真实类型处理)

  • {ts'2016-09-15 17:30:00'}--时间戳
  • {d'2016-09-15'} --仅日期
  • {t'17:30:00'} --只有时间

ISO8601(最适合任何地方

  • '2016-09-15T17:30:00'——注意T中间!

未分隔(被误解为数字的风险很小)

  • '20160915' --仅适用于日期

谨记:无效日期往往会出现奇怪的错误

  • 没有 6 月 31 日或 2 月 30 日...

奇怪转换错误的另一个原因:执行顺序!

众所周知,SQL-Server 会按照人们可能没有预料到的执行顺序来做事。您的书面声明看起来像是在某些与类型相关的操作发生之前完成了转换,但引擎决定 - 为什么会 - 在稍后的步骤中进行转换。

这是一篇很棒的文章,用示例解释了这一点:Rusano.com:“t-sql-functions-do-no-imply-a-certain-order-of-execution”,这是相关的问题

于 2016-09-15T06:38:24.480 回答
7

只需更新日期格式,如下所示

yyyy-MM-dd hh:MM:ss

它为我解决了问题并且效果很好

于 2017-08-19T09:57:43.717 回答
5

我试过这个,它对我有用:

SELECT CONVERT(date, yourDate ,104)
于 2020-06-16T12:24:53.433 回答
4

最好的方法是这段代码

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
于 2016-01-29T17:44:09.580 回答
3

尝试连接getdate()到要插入到 nvarchar 字段中的字符串时,我遇到了这个问题。

我做了一些演员来解决它:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

这是一个经过消毒的例子。其中的关键部分是:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

将日期转换为datetime2,然后将nvarchar其连接起来。

于 2018-08-16T15:11:42.547 回答
2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,
于 2016-01-11T19:40:07.723 回答
2

实际在 sql server 上运行的日期时间格式是

yyyy-mm-dd hh:MM:ss
于 2016-03-18T11:49:04.870 回答
2

请试试这个。

SQL Server 需要 MM/DD/YYYY 格式的日期,如果将英语设置为默认语言。这里将 datepicker 值保存到 sql2008 数据库。我的字段类型是数据库中的 datetime。dpdob 是我的 datepicker 名称。

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

现在在插入查询中使用 dob。

于 2016-06-02T04:49:46.927 回答
1

你可以试试这段代码

select (Convert(Date, '2018-04-01'))
于 2018-04-10T08:45:02.057 回答
1

这是从 ISO 字符串轻松转换为 SQL-Server 的方法datetime

INSERT INTO time_data (ImportateDateTime) VALUES (CAST(CONVERT(datetimeoffset,'2019-09-13 22:06:26.527000') AS datetime))

来源https://www.sqlservercurry.com/2010/04/convert-character-string-iso-date-to.html

于 2019-12-03T22:36:07.140 回答
1

对我来说,这很有效:

INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')
于 2020-01-29T15:29:23.740 回答
0

从 web.config 文件将文化设置为英语

  <globalization uiCulture="en-US" culture="en-US" />

例如,如果您将文化设置为阿拉伯语,则 thime 将是

‏22‏/09‏/2017‏ 02:16:57 ص

并且您收到错误:在插入日期时间时从字符串转换日期和/或时间时转换失败

于 2017-09-22T04:57:03.767 回答
0

在编写 SQL 插入查询时,将日期写在单引号中,并以日期格式 (DD/MM/YYYY) 使用正斜杠,如下所示:

insert into table_name (Emp_Id, Name, **DOB**) values
(01, 'Suresh Kumawat', **'22/03/2015'**);
于 2021-08-17T07:12:29.713 回答
0

当日期不存在时也会显示此错误(例如,日期'09-31-2021'不存在,因为九月的长度为 30 天)。

于 2021-10-05T08:05:25.963 回答