【发布时间】:2015-06-12 08:06:14
【问题描述】:
我已将 2005 数据库迁移到 2012
有一个存储过程可以将今天的日期插入表中
IF NOT EXISTS(SELECT * FROM tblTime WHERE [Day] = DATEPART(day,GETDATE())
AND [Month] = DATEPART(month,GETDATE())
AND [Year]= DATEPART(year,GETDATE()) )
BEGIN
INSERT INTO tblTime (Period,[Day],[Month],[Year],MonthPrefix)
VALUES (CONVERT(VARCHAR(10), GETDATE(), 105),
DATEPART(day,GETDATE()),
DATEPART(month,GETDATE()),
DATEPART(year,GETDATE()),
CASE DATEPART(month,GETDATE())
WHEN 1 THEN 'JAN'
WHEN 2 THEN 'FEB'
WHEN 3 THEN 'MAR'
WHEN 4 THEN 'APR'
WHEN 5 THEN 'MAY'
WHEN 6 THEN 'JUN'
WHEN 7 THEN 'JUL'
WHEN 8 THEN 'AUG'
WHEN 9 THEN 'SEP'
WHEN 10 THEN 'OCT'
WHEN 11 THEN 'NOV'
WHEN 12 THEN 'DEC'
END
)
END
当它在新的 2012 SQL 框上运行时,日期被输入为
2015-12-06 00:00:00
但是旧 2005 上的相同 SP 会读取
2015-06-12 00:00:00
我检查了两台服务器的语言设置等是否相同。
但是有什么我错过了。
非常感谢您的阅读。
【问题讨论】:
-
您是否检查了服务器/数据库上的默认语言和排序规则?当您使用相同的转换样式选择日期时,您会得到不同的结果吗?
-
这不是 SQL Server 问题 - 您使用了错误的类型。即使在 2005 年,您也应该不将日期作为字符串传递或存储,因为任何区域设置或语言更改都会导致问题。在 2012 年,如果您不想要时间部分,可以使用
date类型。 -
你想去掉时间部分吗? 105 是意大利语的
dd-mm-yyyy格式。该字段的类型是什么,您希望返回 ISO 日期的查询是什么?如果period是datetime,则您正在强制从一个语言环境到另一个语言环境进行不必要的(和错误的)转换。使用cast(GETDATE() as date) -
你真的应该重新设计你的桌子。现在,您在 5 个不同的列中保留一个日期,其中 2 个是 char 或 varchar。相反,您应该简单地保留一个日期列,并在选择语句或表示层上处理显示格式(后者是最好的选择)。由于您从 2005 年切换到 2012 年,我知道这是一个包含值的表,并且您可能已经构建了使用该表中数据的应用程序,因此这可能是一个痛苦的过程。不过,这是我能给你的最好建议。
-
您也可以通过使用
FORMAT(GETDATE(),'MMM','en-US')来摆脱月份名称查找
标签: sql-server sql-server-2005 sql-server-2012