2013-04-23 45 views
14

Tôi đã có cột DATETIME trong bảng SQL Server 2008 có tên là ShiftDate. Tôi muốn chuyển đổi cột này thành cột DATE trong truy vấn:Máy chủ SQL không thể gọi phương thức vào ngày

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

Tôi đang chỉnh sửa truy vấn này trong SSMS. Nếu tôi chạy truy vấn trong cửa sổ truy vấn chuẩn, tôi sẽ không gặp bất kỳ lỗi nào. Nếu tôi chạy điều này trong cửa sổ Trình chỉnh sửa chế độ xem, tôi gặp lỗi "Không thể gọi phương thức vào ngày".

Tôi đã thử phương pháp CAST nhưng nó bị lỗi tương tự.

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

Thông báo lỗi đầy đủ là:

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. 

Tôi có khuynh hướng nghĩ rằng đây là một lỗi trong SSMS, nhưng tôi muốn để có được một số thông tin phản hồi từ folks StackOverflow như thế nào để chuyển đổi một datetime vào một ngày. Tôi có thể dễ dàng chuyển đổi nó thành một cột chuỗi, nhưng nó không phải là lý tưởng như Excel sẽ không nhìn thấy nó như là một ngày.

+11

Không sử dụng các nhà thiết kế trực quan như trình chỉnh sửa chế độ xem. Họ rất ngột ngạt và đầy lỗi. Viết mã CREATE VIEW của bạn trong cửa sổ truy vấn thông thường. –

Trả lời

0

Tôi có thể giả định rằng (ShiftDate AS DATE) phải có định dạng ngày giờ. Nếu bạn cố gắng này:

CAST (CONVERT (DATE, ShiftDate) như Varchar)

18

Bạn là chính xác, nó là một lỗi trong SSMS. Tôi đang sử dụng SQL Server Management Studio 2008 R2 và khi tôi cố gắng để tạo ra một Xem sử dụng được xây dựng trong thiết kế, tôi nhận được thông báo lỗi tương tự như bạn:

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

Như @Aaron Bertrand đã đề cập, để giải quyết vấn vấn đề, chọn 'Truy vấn mới' và tạo Chế độ xem trong cửa sổ Truy vấn. Đối với mã của bạn, nó sẽ là:

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

Chỉ lưu chế độ xem bất kể lỗi và nó sẽ thành công – Arthur

+2

4 năm sau ... và lỗi này vẫn chưa được khắc phục ... :(Điều này rất khó chịu vì tôi không thể xem nhanh kết quả của chế độ xem hiện tại – Giffyguy

-2

Vấn đề là với tên ShiftDate của thuộc tính trong bảng bên dưới. Khi đổi tên thành thứ gì đó không chứa từ Ngày làm ký tự cuối cùng, chế độ xem sẽ hoạt động. Hãy thử đổi tên thành ShiftDateDD chẳng hạn.

0

Đôi khi làm việc này ...

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

(Vâng, tôi biết nó không phải là ngày, nhưng nó là một bước gần hơn)

Trong cùng một truy vấn, nó hoạt động trong ngoài lựa chọn, nhưng không bên trong union all ...

Đừng hỏi tại sao: P

+1

Cảm ơn @Robert;) – CodeMeHappy

3

nó có vẻ là một lỗi thực như đã đề cập ở trên bởi https://stackoverflow.com/users/464923/will, thừa hưởng từ MS Access ngày cũ với tất cả những gì Sự bất tiện của bạn, Bạn chỉ cần bỏ qua thông báo lỗi và lưu lại khung nhìn của bạn rồi chạy nó trong một cửa sổ SSMS thông thường, sẽ không có lỗi nào được ném ra.

1

Từ kinh nghiệm của tôi, lỗi có thể bị bỏ qua. Chỉ cần lưu khung nhìn và truy vấn nó bên ngoài cửa sổ Design/"View editor" (trong cửa sổ truy vấn mới) và nó sẽ hoạt động.

0

Thay vào đó, bạn có thể sử dụng tùy chọn Chuyển đổi.

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

Bạn có thể xem các tùy chọn khác nhau của định dạng ngày here.

0

Lỗi này vẫn còn hiện diện trong Management Studio 2016, có vẻ như bây giờ giải pháp duy nhất là truyền vào một varchar và sống với nó nếu bạn muốn sử dụng trình thiết kế truy vấn.

+0

Không - bạn thực sự có thể lưu mã của bạn và kiểm tra nó bằng cách chạy chế độ xem từ bên ngoài trình thiết kế. (tức là chọn chế độ xem trong trình khám phá đối tượng và thực thi từ đó). – Paul

1

Bạn có thể tạo hàm và sử dụng hàm đó khi cần chuyển đổi từ DATETIME sang 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 

Sau đó, trong chế độ xem, hãy gọi hàm để chuyển đổi DATETIME của bạn.

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

Bạn sẽ không nhận được thông báo lỗi và có thể sử dụng lại được. (Thử nghiệm trong SQL Server 2012)

Các vấn đề liên quan