SQL Server无法在日期调用方法

时间:2013-04-23 22:39:41

标签: sql-server-2008

我在名为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人员那里得到一些关于如何将datetime列转换为日期的反馈。我可以轻松地将其转换为字符串列,但它并不理想,因为Excel不会将其视为日期。

10 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

您可以创建一个函数,并在需要将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中测试)

答案 3 :(得分:0)

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

CAST(CONVERT(DATE,ShiftDate)为Varchar)

答案 4 :(得分:0)

有时这会有效......

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

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

在同一个查询中,它在外部选择中工作,但不在联盟内部工作...

不要问为什么:P

答案 5 :(得分:0)

您可以改用转换选项。

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

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

答案 6 :(得分:0)

此错误仍然存​​在于Management Studio 2016中,现在似乎唯一的解决方案是转换为varchar,如果您想使用查询设计器,请使用它。

答案 7 :(得分:0)

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

假设TableName为Person,列为Age

您已经在查询中编写了以下内容:

Person.Age.Age = 30

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

答案 8 :(得分:0)

此问题在SSMS 18.4中仍然存在。我只是将它作为“想法”发送给了Microsoft,并且由于Microsoft对每个给定bug报告的关注(仅)取决于它的社会支持,因此,如果您希望对其进行修复,请在下面对其进行投票

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

答案 9 :(得分:-2)

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