4

我需要varchar在我的表中插入一个。表中的类型是 adatetime所以我需要转换它。我不认为这会是一个大问题,但是它一直插入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')

但这只会带来同样的问题。任何人看到我做错了什么?

谢谢

4

2 回答 2

10

如果必须使用基于字符串的日期格式,则应选择一种安全且适用于每个 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

于 2012-11-28T08:48:11.833 回答
0

只是想抛开一个事实,即多年后我在试图找到我的问题的答案时发现了这个 SO 问题(以及许多其他人喜欢它)。

如果您在存储过程中对此进行故障排除,则需要修改存储过程的参数。创建我正在故障排除的代码的程序员@ddt CHAR(10)在存储过程中没有任何修改解决了这个问题。我不得不将参数更改为@ddt smalldatetime.

于 2019-10-09T18:35:12.520 回答