Sql 插入日期时间时从字符串转换日期和/或时间时,转换失败

Sql 插入日期时间时从字符串转换日期和/或时间时,转换失败,sql,sql-server,Sql,Sql Server,我试图创建一个表,如下所示 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转换为datetime 然后我尝试了下面的格式作为我们stackoverflow建议的帖子之一 insert into table1 valu

我试图创建一个表,如下所示

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转换为datetime

然后我尝试了下面的格式作为我们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));
但我仍然得到错误的说法

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


有什么建议吗?

SQL Server支持多种格式-请参阅。大多数格式取决于您的设置,因此,这些设置有时可能有效,有时无效

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

SQL Server支持的有两种风格:

  • YYYYMMDD
    仅适用于日期(无时间段);注意:无破折号,这非常重要
    YYYY-MM-DD
    独立于SQL Server中的日期格式设置,在所有情况下都将工作
或:

  • 日期和时间的
    YYYY-MM-DDTHH:MM:SS
    -此处注意:此格式有破折号(但可以省略),并且在
    DATETIME
    的日期和时间部分之间有一个固定的
    T
    分隔符
这对SQL Server 2000及更新版本有效

因此,在您的特定情况下,请使用以下字符串:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
你应该很好(注意:你需要使用国际24小时格式,而不是12小时AM/PM格式)

或者:如果您使用的是SQL Server2008或更高版本,您还可以使用
DATETIME2
数据类型(而不是普通的
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中的任何语言和日期格式设置。

简单回答-5是意大利语“yy”,105是意大利语“yyy”。因此:

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)

将正常工作。

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

例如:

创建表MyTable(MyDate)

插入MyTable(MyDate)值('2015-02-29')

SQL server将抛出以下错误:

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


出现此错误的原因很简单,就是在2015年没有此类日期(2月29日)。

最好的方法是使用此代码

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
select (Convert(Date, '2018-04-01'))

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

yyyy-mm-dd hh:MM:ss
请试试这个

如果将英语设置为默认语言,SQL Server希望日期为MM/DD/YYYY格式。我正在将日期选择器值保存到sql2008数据库。我的字段类型为数据库中的日期时间。dpdob是我的日期选择器名称

           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

现在在insert查询中使用dob。

只要有可能,就应该避免特定于区域性的日期/时间文本

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

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

ODBC(我最喜欢的,因为它立即被当作真正的类型处理)
  • {ts'2016-09-15 17:30:00'}
    --时间戳
  • {d'2016-09-15'}
    --仅限日期
  • {t'17:30:00'}
    --仅限时间
ISO8601(适用于所有地方的最佳标准)
    >代码> 2016~0915T17:30:'——注意中间的<代码> t>代码>李>
未操作(被误解为数字的微小风险)
  • '20160915'
    ——仅适用于纯日期
请记住:无效日期往往会出现奇怪的错误
  • 没有6月31日或2月30日
奇怪的转换错误还有一个原因:执行顺序! 众所周知,SQL Server会按照人们可能没有预料到的执行顺序来执行操作。您的书面语句看起来像是在发生与类型相关的操作之前完成了转换,但是引擎决定(为什么会)在以后的步骤中进行转换


下面是一篇很好的文章,用例子来解释这一点:下面就是。

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

yyyy-MM-dd hh:MM:ss

它为我解决了这个问题,并且运行良好

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

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

例如,如果将区域性设置为阿拉伯语,则thime将为

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

当插入日期时间时,从字符串转换日期和/或时间时,转换失败。您可以尝试以下代码

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
select (Convert(Date, '2018-04-01'))

我在尝试将
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 />'
   )
插入到[系统属性表]([系统属性标签],[系统属性值])值中
(
“电子邮件头”,
“111任何地方的任何街
任何地方的任何街,St 11111
” 强制转换(强制转换(getdate()为datetime2)为nvarchar)+ “


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

…'+CAST(CAST(getdate()作为datetime2)作为nvarchar)+'…INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')
SELECT CONVERT(date, yourDate ,104)