将转换后的varchar插入日期时间sql
我需要在我的表中插入一个将转换后的varchar插入日期时间sql,sql,sql-server,sql-server-2008,datetime,insert,Sql,Sql Server,Sql Server 2008,Datetime,Insert,我需要在我的表中插入一个varchar。表中的类型是datetime,因此我需要将其转换。我不认为这会是个大问题,但是它一直插入1900-01-01 00:00:00.000,而不是我想要的日期。当我选择转换日期时,它会显示正确的日期 我将向您展示代码: INSERT INTO Item (CategoryId, [Date], Content, CreatedOn) SELECT CategoryId, Convert(datetime, '28/11/2012', 10
varchar
。表中的类型是datetime
,因此我需要将其转换。我不认为这会是个大问题,但是它一直插入1900-01-01 00:00:00.000
,而不是我想要的日期。当我选择转换日期时,它会显示正确的日期
我将向您展示代码:
INSERT INTO Item (CategoryId, [Date], Content, CreatedOn)
SELECT
CategoryId, Convert(datetime, '28/11/2012', 103), Content, GetDate()
FROM
Item i
JOIN
Category c ON i.CategoryId = c.Id
JOIN
Division d ON d.Id = c.DivisionId
WHERE
Date = Convert(datetime, '31/03/2005', 103)
AND d.Id = '142aaddf-5b63-4d53-a331-8eba9b0556c4'
where子句非常有效,并提供了所需的筛选项,除转换日期外,所有数据都正确插入。就像我说的1900-
如果我只是做了选择,那么:
SELECT CategoryId, Convert(datetime, '28/11/2012', 103), Content, GetDate()
FROM Item i
JOIN Category c ON i.CategoryId = c.Id
JOIN Division d ON d.Id = c.DivisionId
WHERE Date = Convert(datetime, '31/03/2005', 103) AND d.Id = '142aaddf-5b63-4d53-a331-8eba9b0556c4'
我得到的正确日期是:2012-11-28 00:00:00.000
。我尝试使用不同的转换,如:
Convert(datetime, '20121128')
但这也带来了同样的问题。有人知道我做错了什么吗
Thx如果必须使用基于字符串的日期格式,则应选择一种安全且适用于每个SQL Server实例的格式,而不考虑日期格式、语言和区域设置 这种格式称为ISO-8601格式,它是
YYYYMMDD (note: **NO** dashes!)
或
用于DATETIME
列
所以不是
Convert(datetime, '28/11/2012', 103)
你应该使用
CAST('20121128' AS DATETIME)
那你就没事了
如果您使用的是SQL Server2008——您还可以考虑在只需要日期(无时间部分)的情况下使用
DATE
(而不是DATETIME
)。这比使用DATETIME
更容易,时间部分总是00:00:00
只是想抛开一个事实,几年后,当我试图找到问题的答案时,我发现了这个问题(以及许多其他类似的问题)
如果在存储过程中对此进行故障排除,则需要修改存储过程的参数。创建我正在排除故障的代码的程序员有
@ddt CHAR(10)
,并且在存储过程中没有进行任何修改就解决了问题。我必须将参数更改为@ddt smalldatetime
为什么您在select和insert语句中使用同一个表?表上可能有触发器吗?您正在插入一个常量字符串或字段值?我实际上是从visual studio调用此查询并动态地给出日期。我将查询作为带有输入值的字符串传递。但目前我只是在sql server中测试查询,因为只要它在sql server中不起作用,在我的应用程序中使用它是没有用的。我使用相同的表,因为我需要将项目从一个日期复制到另一个日期。因此,该项需要在两个不同的日期完全相同Side note-当您从visual studio(可能是从VS中的.NET程序)传递值时,您应该将它们作为DateTime
s传递,而不是来回转换为字符串。它仍然提供了完全相同的信息。我使用CAST('20121128'作为日期时间),但插入的日期保持1900-01-01 00:00:00.000。我不能用date,因为将来时间可能会派上用场。
CAST('20121128' AS DATETIME)