Mar*_*ari 144 sql sql-server
我试图创建一个表如下,
create table table1(date1 datetime,date2 datetime);
Run Code Online (Sandbox Code Playgroud)
首先我尝试插入如下的值,
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
Run Code Online (Sandbox Code Playgroud)
它说错了,
无法将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));
Run Code Online (Sandbox Code Playgroud)
但我仍然得到错误说,
从字符串转换日期和/或时间时转换失败
有什么建议?
mar*_*c_s 140
SQL Server支持许多格式 - 请参阅CDN和CONVERT上的MSDN联机丛书.大多数这些格式取决于您拥有的设置 - 因此,这些设置可能会有效 - 有时不会.
解决此问题的方法是使用SQL Server支持的(略微调整的)ISO-8601日期格式 - 此格式始终有效 - 无论您的SQL Server语言和日期格式设置如何.
在ISO-8601格式由SQL Server支持有两种形式:
YYYYMMDD只为日期(没有时间部分); 请注意:没有破折号!,这非常重要!YYYY-MM-DD是不是独立于你的SQL Server的日期格式设置,将不适用于所有情况!要么:
YYYY-MM-DDTHH:MM:SS对于日期和时间 - 请注意:此格式有破折号(但可以省略),并且T在您的日期和时间部分之间固定为分隔符DATETIME.这适用于SQL Server 2000及更高版本.
所以在你的具体案例中 - 使用这些字符串:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
Run Code Online (Sandbox Code Playgroud)
你应该没问题(注意:你需要使用国际24小时格式而不是12小时AM/PM格式).
或者:如果您使用的是SQL Server 2008或更高版本,您也可以使用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
Run Code Online (Sandbox Code Playgroud)
不要问我为什么整个主题如此棘手而且有些混乱 - 这就是它的方式.但是使用这种YYYYMMDD格式,您可以适用于任何版本的SQL Server以及SQL Server中的任何语言和日期格式设置.
Ash*_*ada 22
SQL服务器中的转换有时不会因为使用的日期或时间格式而失败,这仅仅是因为您试图存储系统无法接受的错误数据.
例:
Create Table MyTable (MyDate);
Insert Into MyTable(MyDate) Values ('2015-02-29');
SQL Server将抛出以下错误:
Conversion failed when converting date and/or time from character string.
出现此错误的原因很简单,就是在2015年(2015年)没有这样的日期(2月29日).
Raj*_*Raj 13
简单的回答 - 5是意大利语"yy",105是意大利语"yyyy".因此:
SELECT convert(datetime,'21-02-12 6:10:00 PM',5)
Run Code Online (Sandbox Code Playgroud)
会正常工作,但是
SELECT convert(datetime,'21-02-12 6:10:00 PM',105)
Run Code Online (Sandbox Code Playgroud)
会给出错误.
同样,
SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)
Run Code Online (Sandbox Code Playgroud)
会给出错误,在哪里
SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)
Run Code Online (Sandbox Code Playgroud)
将工作.
应尽可能避免文化特定的日期/时间文字.
有一些安全格式可以提供日期/时间作为文字:
所有的例子 2016-09-15 17:30:00
{ts'2016-09-15 17:30:00'} - 时间戳{d'2016-09-15'} - 仅限日期{t'17:30:00'} - 仅限时间'2016-09-15T17:30:00'- 请注意T中间!'20160915' - 仅限于纯粹的约会众所周知,SQL-Server按照可能没有预期的执行顺序执行操作.您的书面陈述看起来像转换是在某些类型相关的操作发生之前完成的,但引擎决定 - 为什么还要 - 在稍后的步骤中进行转换.
这是一篇很好的文章用例子来解释:Rusano.com:"t-sql-functions-do-no-imply-a-certain-order-of-execution",这里是相关的问题.
只需更新日期格式即可
yyyy-MM-dd hh:MM:ss
Run Code Online (Sandbox Code Playgroud)
它解决了我的问题,它工作正常
小智 5
最好的方法是这段代码
"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
794227 次 |
| 最近记录: |