我在名为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不会将其视为日期。
答案 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报告的关注(仅)取决于它的社会支持,因此,如果您希望对其进行修复,请在下面对其进行投票
答案 9 :(得分:-2)
问题在于基础表中属性的名称ShiftDate。当重命名为不包含单词Date作为最后一个字符的内容时,视图可以正常工作。例如,尝试重命名为ShiftDateDD。