|
|
打篮球的自行车 · SQL语句详解(三)——SQL子查询_的结果 ...· 1 年前 · |
|
|
坚韧的椅子 · ubuntu16.04 ...· 2 年前 · |
|
|
打盹的黑框眼镜 · C语言大作业(随机洗牌Shuffle ...· 2 年前 · |
|
|
愉快的包子 · CC2640R2F BLE5.0 ...· 2 年前 · |
我正在尝试创建一个表,如下所示,
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支持许多格式-请参阅 MSDN Books Online on CAST and CONVERT 。这些格式中的大多数都依赖于您的设置的-因此,这些设置有时可能起作用,有时则不起作用。
解决此问题的方法是使用SQL Server支持的(稍作调整的) SQL 8601日期格式-此格式适用于 always ,而不考虑您的SQL Server语言和日期格式设置。
SQL Server支持的 ISO-8601 format 有两种风格:
YYYYMMDD
只表示日期(没有时间部分);这里注意:
没有破折号!
,这非常重要!
YYYY-MM-DD
is 独立于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格式)。
Alternatively:如果您使用的是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
不要问我为什么整个主题如此棘手和令人困惑--这就是它的方式。但是对于
YYYYMMDD
格式,您应该可以适用于SQL Server的任何版本以及SQL Server中的任何语言和日期格式设置。
请试一下这个。
SQL Server要求日期格式为MM/DD/YYYY,如果将language.Here设置为默认日期选择器值到sql2008,则database.My字段类型为datetime in database.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查询中使用道布。
只要有可能,就应该避免使用特定于区域性的日期/时间文字。
有一些安全的格式可以将日期/时间作为文字提供:
2016-09-15 17:30:00
的所有示例
ODBC (我最喜欢的,因为它立即作为真实类型处理)
{ts'2016-09-15 17:30:00'}
--Time Stamp
{d'2016-09-15'}
--Date only
{t'17:30:00'}
--Time only
ISO8601 (无所不在的最佳选择)
'2016-09-15T17:30:00'
--注意中间的
T
!
未分离(极小的被误解为数字的风险)
'20160915'
--仅适用于纯日期
记住:无效的日期往往会出现奇怪的错误
出现奇怪的转换错误的另一个原因是:执行顺序!
众所周知,SQL-Server以一种可能出乎意料的执行顺序进行操作。您编写的语句看起来像是在某个类型相关的操作发生之前完成了转换,但是引擎决定-为什么总是-在后面的步骤中进行转换。
这里有一篇很棒的文章用例子解释了这一点: Rusano.com: "t-sql-functions-do-no-imply-a-certain-order-of-execution" ,这里是 the related question 。
当我尝试将
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
以连接它。
下面是如何轻松地将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
对我来说,这是可行的:
INSERT INTO [MyTable]