29

我在名为 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 不会将其视为日期。

4

11 回答 11

26

你是对的,这是 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
于 2014-05-08T15:05:44.933 回答
4

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

于 2015-08-18T19:03:00.293 回答
1

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

CAST(CONVERT(DATE, ShiftDate) as Varchar)

于 2013-11-20T20:39:42.830 回答
1

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

于 2015-08-26T10:06:52.300 回答
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 中测试)

于 2017-03-17T12:23:43.037 回答
0

有时这有效...

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

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

在同一个查询中,它在外部选择中起作用,但在联合内部却不起作用……

不要问为什么:P

于 2015-06-12T09:35:56.567 回答
0

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

于 2016-11-16T18:48:10.487 回答
0

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

假设 TableName 是Person,列是Age

并且您在查询中编写了如下内容:

Person.Age.Age = 30

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

于 2018-08-01T07:24:37.393 回答
0

您可以改用转换选项。

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

您可以在此处查看日期格式的各种选项。

于 2016-06-30T20:57:05.167 回答
0

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

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

于 2020-08-13T02:04:10.287 回答
-2

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

于 2014-06-30T10:45:05.727 回答