将转换后的varchar插入datetime sql

时间:2012-11-28 08:37:09

标签: 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', 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

3 个答案:

答案 0 :(得分:9)

如果必须使用基于字符串的日期格式,则应选择安全格式,并且无论日期格式,语言和区域设置如何,都可以在每个SQL Server实例中使用。

该格式称为 ISO-8601 格式,它是

YYYYMMDD      (note: **NO** dashes!)

YYYY-MM-DDTHH:MM:SSS

表示DATETIME列。

所以而不是

Convert(datetime, '28/11/2012', 103)

你应该使用

CAST('20121128' AS DATETIME)

然后你应该没事。

如果您使用的是SQL Server 2008 - 您还可以考虑使用DATE(而不是DATETIME)来处理您只需要日期的情况(没有时间)一部分)。这比使用DATETIME并且时间部分始终为00:00:00

更容易

答案 1 :(得分:0)

只是想抛出一个事实,就是几年后我找到了这个SO问题(以及许多其他类似的问题),同时试图找到我的问题的答案。

如果要在存储过程内部进行故障排除,则需要在存储过程的参数处进行修改。创建我正在排除故障的代码的程序员有@ddt CHAR(10),并且存储过程内部没有任何修改即可解决问题。我必须将参数更改为@ddt smalldatetime

答案 2 :(得分:-1)

我没有测试过,但试试“11/28/2012”?