【问题标题】:Insert converted varchar into datetime sql将转换后的 varchar 插入 datetime sql
【发布时间】:2012-11-28 08:37:08
【问题描述】:

我需要在我的表中插入一个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')

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

谢谢

【问题讨论】:

  • 你怎么在select和insert语句中使用同一张表?
  • 桌子上会不会有触发器?
  • 您正在插入一个常量字符串或字段值?
  • 我正在做的实际上是从 Visual Studio 调用此查询并动态给出日期。我将查询作为带有输入值的字符串传递。但目前我只是在 sql server 中测试查询,因为只要它在那里不起作用,在我的应用程序中使用它就没有用。我正在使用同一张表,因为我需要将项目从一个日期复制到另一个日期。所以项目需要在 2 个不同的日子里完全一样
  • 旁注 - 当您从 Visual Studio 传递值时(可能来自 VS 中的 .NET 程序),您应该将它们作为 DateTimes 传递,而不是来回转换到字符串。

标签: sql sql-server sql-server-2008 datetime insert


【解决方案1】:

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

【讨论】:

  • 它仍然给了我完全相同的东西。我使用了 CAST('20121128' AS DATETIME) 但插入的日期保持 1900-01-01 00:00:00.000。我不能使用日期,因为将来时间可能会派上用场。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多