Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将转换后的varchar插入日期时间sql_Sql_Sql Server_Sql Server 2008_Datetime_Insert - Fatal编程技术网

将转换后的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)