2014-11-21 151 views
1

当我尝试执行此查询插入日期

INSERT INTO StateRegion 
     (FullName , 
      Abbreviation , 
      RegionType , 
      Admitted , 
      Capital 
     ) 
VALUES ('Alabama' , 
      'AL' , 
      1 , 
      '1819-Dec-14' , 
      'Montgomery' 
     ); 

它给了我错误的SQL日期转换错误:从文字 字符串转换日期和/或时间时

转换失败

录取为Date类型。

的问题是我不能改变这种格式:1819-Dec-14,是有可能转换方法添加到上面的查询?

表定义:

CREATE TABLE StateRegion 
(
    ID   bigint  PRIMARY KEY IDENTITY(1,1), 
    FullName  varchar(50) NOT NULL, 
    Abbreviation varchar(2) NOT NULL, 
    RegionType smallint  NOT NULL, 
    Admitted  date   NULL, 
    Capital  varchar(50) NULL 
); 
+0

这有没有工作,或者它只是停止工作? – 2014-11-21 19:35:54

+0

它应该工作! – 2014-11-21 19:36:37

+0

它没有工作,线路没有插入 – 2014-11-21 19:39:38

回答

6

该日期格式的月份名称部分根据登录语言进行解释。

您可以更改登录到美国英语或英式英语的默认语言,如果你必须使用格式工作或发出

Set language english 

要那么有问题的查询任意切换之前在运行时设置的格式它后来回来。

如果您有选择使用yyyy-mm-dd或yyyymmdd将会是日期文字的首选格式,但在铸造到date时都可以避免此问题。

-1

使用参数化查询。参数化会将日期以二进制形式发送到服务器,避免依赖于客户机区域设置的任何字符串转换。

实例C#:

SqlCommand sqc = new SqlCommand("INSERT INTO MyTable (DateColumn) VALUES (@date)", con); 
sqc.Parameters.AddWithValue("@date", new DateTime(1819, 12, 14)); 

如果从一个交互式批处理(SQL Server Management Studio中,或类似)运行此,使用SET LANGUAGE确保日期将被正确解析:

SET LANGUAGE ENGLISH; 

INSERT INTO StateRegion (FullName, Abbreviation, RegionType, Admitted, Capital) 
VALUES ('Alabama', 'AL', 1, '1819-Dec-14', 'Montgomery'); 

SqlFiddle example showing correct parsing

+1

这个问题没有用C#标记,为什么给出一个使用它的解决方案? – Lamak 2014-11-21 19:39:36

+0

@Lamak,因为如果不是通过交互式UI完成的话,它是SQL Server最常见的客户端。 – Mitch 2014-11-21 19:49:59

-2

您可以尝试使用一个明确的格式转换。你不解释为什么你不能改变格式,但我想象你正在读取那些已经存储的值。您可以使用CONVERT

DECLARE @Admitted VARCHAR(11); 
SET @Admitted = '1819-Dec-14' 


SELECT CONVERT(DATETIME,RIGHT(@Admitted,2)+' '+ 
         SUBSTRING(@Admitted,6,3)+' '+ 
         LEFT(@Admitted,4),106); 
0

请勿混淆存储格式和显示格式。仅仅因为服务器在数据库中将日期存储为'1819-12-14',您可以使用自定义格式输出来显示。 然后用功能,如显示问题正确:

CREATE FUNCTION usp_FormatedDateString (@Date Date) 
RETURNS VARCHAR(50) 
AS 
BEGIN 
    DECLARE @RETURN AS VARCHAR(50) 
    DECLARE @I INT = 0 
    DECLARE @M AS VARCHAR(100) = 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC' 
    SET @RETURN = CAST(DATEPART(YEAR,@Date) AS VARCHAR(4)) 
    SET @I = DATEPART(MONTH, @Date) - 1 
    SET @RETURN = @RETURN + '-' + SUBSTRING(@M,(@I*3)+1,3)+'-'+ CAST (DATEPART(DAY,@Date) AS VARCHAR(2)) 
    RETURN @RETURN 
END 
GO 

然后,当您显示结果:

SELECT FullName,Abbreviation,RegionType, dbo.usp_FormatedDateString (Admitted) as Admitted, Capital FROM StateRegion 

它会显示正确,正确地存储。