【问题标题】:SQL Server Cannot Call Methods on DateSQL Server 无法在日期调用方法
【发布时间】:2013-04-23 22:39:41
【问题描述】:

我在名为 ShiftDate 的 SQL Server 2008 表中有一个 DATETIME 列。我想将其转换为查询中的 DATE 列:

SELECT     ID, ScheduleID, ShiftDate, CONVERT(DATE, ShiftDate) AS ProductionDate
FROM       dbo.ScheduleResults

我正在 SSMS 中编辑此查询。如果我在标准查询窗口中运行查询,我不会收到任何错误。如果我在视图编辑器窗口中运行它,我会收到错误“无法在日期调用方法”。

我尝试了 CAST 方法,但它得到了同样的错误。

SELECT     ID, ScheduleID, ShiftDate, CAST(ShiftDate AS DATE) AS ProductionDate
FROM       dbo.ScheduleResults

完整的错误信息是:

Executed SQL statement: SELECT ID, ScheduleID, ShiftDate, CAST(ShiftDate as DATE).ToString() AS ProductionDate FROM dbo.ScheduleResults
Error Source: .Net SqlClient Data Provider
Error Message: Cannot call methods on date.

我倾向于认为这是 SSMS 中的一个错误,但我想从 StackOverflow 人员那里获得一些关于如何将日期时间列转换为日期的反馈。我可以轻松地将其转换为字符串列,但这并不理想,因为 Excel 不会将其视为日期。

【问题讨论】:

  • 不要使用像视图编辑器这样的视觉设计器。他们是疯狂的,充满了错误。在常规查询窗口中编写您的 CREATE VIEW 代码。

标签: sql-server-2008


【解决方案1】:

你是对的,这是 SSMS 中的一个错误。我正在使用 SQL Server Management Studio 2008 R2,当我尝试使用内置设计器创建视图时,我收到与您相同的错误消息:

SQL Execution Error
Error Source: .Net SqlClient Data Provider
Error Message: Cannot call methods on date.

正如@Aaron Bertrand 所说,要解决此问题,请选择“新建查询”并在“查询”窗口中创建视图。对于您的代码,它将是:

CREATE VIEW myView AS
SELECT     ID, ScheduleID, ShiftDate, CAST(ShiftDate AS DATE) AS ProductionDate
FROM       dbo.ScheduleResults

【讨论】:

  • 无论错误如何,只要保存视图,它应该会成功
  • 4 年后 ... 这个 bug 仍然没有修复 ... :( 这很烦人,因为我永远无法快速预览现有视图的结果,因为我正在更改它们在设计器中。
  • 6年过去了,这个bug还没有修复
  • 8 年过去了,这个 bug 仍然没有修复...
【解决方案2】:

这似乎是https://stackoverflow.com/users/464923/will 上面提到的一个真正的错误,继承自 MS Access 旧时代带来的所有不便,您只需忽略错误消息并保存您的视图,然后在常规 SSMS 窗口中运行它,不会抛出任何错误。

【讨论】:

  • 好兄弟!节省了我很多时间
【解决方案3】:

我可以假设 (ShiftDate AS DATE) 应该具有日期时间格式。 如果你试试这个:

CAST(CONVERT(DATE, ShiftDate) as Varchar)

【讨论】:

    【解决方案4】:

    根据我的经验,这个错误可以忽略。只需保存视图并在设计/“视图编辑器”窗口之外(在新的查询窗口中)查询它,它就会工作。

    【讨论】:

      【解决方案5】:

      您可以创建一个函数并在需要将 DATETIME 转换为 DATE 时使用它。

      USE [MyDatabaseName]
      GO
      
      IF EXISTS (
        SELECT * 
          FROM sys.objects 
         WHERE object_id = OBJECT_ID(N'[dbo].[FN_DateFromDateTime]')
         and  type in (N'FN')
      )
         DROP FUNCTION [dbo].[FN_DateFromDateTime]
      GO
      
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      -- =============================================
      -- Author:      Codestalker
      -- Create date: Mar 17, 2017
      -- Edited date: Mar 17, 2017
      -- Description: Return Date from DateTime.
      -- =============================================
      CREATE FUNCTION [dbo].[FN_DateFromDateTime]
      (
          -- Add the parameters for the function here
          @InputDateTime DateTime
      )
      RETURNS Date
      AS
      BEGIN
              DECLARE @ReturnDate Date
              Set @ReturnDate = CONVERT(DATE, @InputDateTime)  
              Return @ReturnDate
      END   
      GO
      

      然后在您的视图中调用该函数来转换您的 DATETIME。

      SELECT DateTimeColumn, dbo.FN_DateFromDateTime(DateTimeColumn) AS ConvertedDateTime
      FROM dbo.MyTable
      

      您不会收到错误消息,它是可重复使用的。 (在 SQL Server 2012 中测试)

      【讨论】:

        【解决方案6】:

        有时这行得通...

        CAST(CAST(YourDate AS char(10)) AS Datetime)
        

        (是的,我知道这不是日期,但它更近了一步)

        在同一个查询中,它在外部 select 中起作用,但在 union all 内部不起作用...

        不要问为什么:P

        【讨论】:

          【解决方案7】:

          您可以改用转换选项。

          SELECT     ID, ScheduleID, ShiftDate, CONVERT(VARCHAR(10), ShiftDate,101) AS ProductionDate
          FROM       dbo.ScheduleResults
          

          您可以查看日期格式的各种选项here

          【讨论】:

            【解决方案8】:

            Management Studio 2016 中仍然存在此错误,目前看来唯一的解决方案是转换为 varchar 并使用它,如果您想使用查询设计器。

            【讨论】:

            • 否 - 您实际上可以保存代码并通过从设计器外部运行视图来测试它。 (即在对象资源管理器中选择视图并从那里执行)。
            【解决方案9】:

            当您错误地将列多次放在表名之后也会发生这种情况。

            假设表名是Person,列是Age

            你在查询中写了这样的:

            Person.Age.Age = 30
            

            希望我的经验对某人有所帮助。

            【讨论】:

              【解决方案10】:

              SSMS 18.4 中仍然存在此问题。我只是将它作为“想法”发送给微软,由于微软对每个给定错误报告的关注(仅)取决于它的社会支持,如果你想修复它,请去投票支持它

              https://feedback.azure.com/forums/908035-sql-server/suggestions/41135050-ssms-returns-error-on-valid-query-in-view-designer

              【讨论】:

                【解决方案11】:

                问题在于基础表中属性的名称 ShiftDate。当重命名为不包含单词 Date 作为最后一个字符的内容时,该视图有效。例如,尝试重命名为 ShiftDateDD。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-10-12
                  • 1970-01-01
                  • 2010-10-05
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-09-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多