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
独立于SQL Server中的日期格式设置,在所有情况下都将不工作李>YYYY-MM-DD
- 日期和时间的
-此处注意:此格式有破折号(但可以省略),并且在YYYY-MM-DDTHH:MM:SS
的日期和时间部分之间有一个固定的DATETIME
分隔符T
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)