【问题标题】:SQL Insert Date Mystery on 2012 from 2005从 2005 年到 2012 年的 SQL 插入日期之谜
【发布时间】: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 日期的查询是什么?如果perioddatetime,则您正在强制从一个语言环境到另一个语言环境进行不必要的(和错误的)转换。使用cast(GETDATE() as date)
  • 你真的应该重新设计你的桌子。现在,您在 5 个不同的列中保留一个日期,其中 2 个是 char 或 varchar。相反,您应该简单地保留一个日期列,并在选择语句或表示层上处理显示格式(后者是最好的选择)。由于您从 2005 年切换到 2012 年,我知道这是一个包含值的表,并且您可能已经构建了使用该表中数据的应用程序,因此这可能是一个痛苦的过程。不过,这是我能给你的最好建议。
  • 您也可以通过使用FORMAT(GETDATE(),'MMM','en-US')来摆脱月份名称查找

标签: sql-server sql-server-2005 sql-server-2012


【解决方案1】:

你可以运行

DBCC USEROPTIONS

在两个不同的SQL 框中检查日期格式。 要设置该值,请使用

SET DATEFORMAT ymd

或任何其他组合,如 mdy、dmy 等

【讨论】:

  • 将日期作为字符串传递通常是个坏主意,但至少在 SQL Server 2012 中,您可以使用 PARSETRY_PARSE 而不是更改选项
  • 谢谢你,我检查了 2 台服务器,发现不一样。更改值以匹配并重新运行 SP 后,结果仍然相同!
【解决方案2】:

我必须为每个用户更改语言。

设置为英语,但对我来说应该是英式英语。

更改后,重新启动实例。

感谢以上帖子为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多