将转换后的varchar插入datetime sql

el *_*rty 3 sql sql-server datetime insert sql-server-2008

我需要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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

我得到了正确的日期:2012-11-28 00:00:00.000.我试图使用不同的转换,如:

Convert(datetime, '20121128')
Run Code Online (Sandbox Code Playgroud)

但这只是给出了同样的问题.谁看到我做错了什么?

谢谢

mar*_*c_s 9

如果必须使用基于字符串的日期格式,则应选择一个安全且适用于每个SQL Server实例的日期格式,而不管日期格式,语言和区域设置如何.

这种格式称为ISO-8601格式,它也是

YYYYMMDD      (note: **NO** dashes!)
Run Code Online (Sandbox Code Playgroud)

要么

YYYY-MM-DDTHH:MM:SSS
Run Code Online (Sandbox Code Playgroud)

对于一个DATETIME专栏.

而不是

Convert(datetime, '28/11/2012', 103)
Run Code Online (Sandbox Code Playgroud)

你应该使用

CAST('20121128' AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

然后你应该没事.

如果您使用的是SQL Server 2008,那么当您只需要日期(没有时间部分)时,您也可以考虑使用DATE(而不是DATETIME).这比使用DATETIME和时间部分总是更容易00:00:00