当我尝试执行此查询时
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
);
答案 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');
答案 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