在sql server中插入日期

时间:2014-11-21 19:32:39

标签: sql sql-server sql-server-2008

当我尝试执行此查询时

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

它给了我错误sql日期转换错误:

  

从字符转换日期和/或时间时转换失败   串

录取是日期类型。

问题是我无法更改此格式: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
);

5 个答案:

答案 0 :(得分:6)

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

如果您必须使用该格式或发出

,您可以将登录的默认语言更改为美国英语或英国英语
  Set language english

要在有问题的查询之前在运行时设置格式,然后可选择将其重新切换回来。

如果你有使用yyyy-mm-dd或yyyymmdd的选择,那么日期文字的首选格式虽然在转换为date时都避免了这个问题。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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

它将显示正确并正确存储。

答案 3 :(得分:-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);

答案 4 :(得分:-3)

Chang的数据类型为VARCHAR