sql - 将转换后的 varchar 插入 datetime sql

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

我需要插入一个 varchar在我的 table 上。表中的类型是 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')

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

谢谢

最佳答案

如果您必须使用基于字符串的日期格式,您应该选择一种 保险箱 并且适用于每个 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

关于sql - 将转换后的 varchar 插入 datetime sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13600924/

相关文章:

sql - MS SQL 子查询

SQL Server - 查找日期范围(不包括年份)之间的人员

mysql - 将父数据左连接到多个左连接子数据的简单方法

mysql - 微软访问: Importing Table with keeping the existing record

sql-server-2008 - sql server 2008 中的电子邮件验证?

php - 通过 PHP 连接到 SQL Server 2008

mysql - perl - 在数据库中发送多个请求

arrays - Sequelize - 存储过程的多个结果集合并到一个数组中

sql-server - 为什么 SQL Server 中的表名以 "dbo"开头?

sql - 如果找到 USER,则选择最后一行