2013-04-23 15 views
14

Mam kolumnę DATETIME w tabeli SQL Server 2008 o nazwie ShiftDate. Chcę przekonwertować to na kolumnę DATE w zapytaniu:Serwer SQL nie może wywoływać metod Data

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

Edytuję to zapytanie w SSMS. Jeśli uruchomię zapytanie w standardowym oknie zapytania, nie otrzymam żadnych błędów. Jeśli uruchomię to w oknie edytora widoku, pojawia się błąd "Nie można wywołać metody na datę".

Próbowałem już metody CAST, ale wystąpił ten sam błąd.

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

Pełny komunikat o błędzie:

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. 

Jestem skłonny sądzić, że jest to błąd w SSMS, ale chciałbym, aby uzyskać pewne informacje zwrotne od ludzi stackoverflow, jak przekonwertować datetime kolumna do daty. Mogę łatwo przekonwertować go na kolumnę ciąg, ale nie jest idealny, ponieważ Excel nie zobaczy go jako datę.

+11

Nie używaj projektantów wizualnych, takich jak edytor widoków. Są przerażające i pełne błędów. Napisz swój kod CREATE VIEW w zwykłym oknie zapytania. –

Odpowiedz

0

Mogę założyć, że (ShiftDate AS DATE) powinien mieć format daty i godziny. Jeśli spróbujesz to:

CAST (konwersja (data, ShiftDate) jako varchar)

18

Masz rację, to jest to błąd w SSMS. Używam SQL Server Management Studio 2008 R2 i gdy próbuję utworzyć widok za pomocą wbudowanego w projektanta, mam ten sam komunikat o błędzie, jak Ty:

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

Jak wspomniano @Aaron Bertrand, aby rozwiązać wydać, wybierz "Nowe zapytanie" i utwórz okno Wyświetl w zapytaniu. Dla Twojego kodu będzie to:

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

Po prostu zapisz widok niezależnie od błędu i powinien się on powodzić – Arthur

+2

4 lata później ... i ten błąd nadal nie jest naprawiony ... :(To bardzo denerwujące, ponieważ nie mogę na zawsze szybko wyświetlić podglądu istniejących widoków jak robię zmiany w nich w projektancie – Giffyguy

-2

Problem dotyczy nazwy ShiftDate atrybutu w tabeli podstawowej. Po zmianie nazwy na coś, co nie zawiera słowa Data jako ostatniego znaku, widok działa. Spróbuj zmienić nazwę na ShiftDateDD na przykład.

0

Czasami to działa ...

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

(Tak wiem, że to nie jest data, ale to jest jeden krok bliżej)

W tej samej kwerendy, to działało w zewnętrznej select, ale nie wewnątrz unii wszystko ...

nie pytaj dlaczego: P

+1

Dzięki @Robert;) – CodeMeHappy

3

wydaje się być prawdziwym bug jak wspomniano powyżej https://stackoverflow.com/users/464923/will, dziedziczone z MS Access dawnych czasach ze wszystkimi jej niedogodności, Wystarczy zignorować komunikat o błędzie i zapisać swój widok, a następnie uruchomić go w zwykłym oknie SSMS, nie będzie zgłaszany błąd.

1

Z mojego doświadczenia wynika, że ​​błąd można zignorować. Po prostu zapisz widok i zapytaj go poza oknem Design/"View editor" (w nowym oknie zapytania) i będzie działał.

0

Zamiast tego można użyć opcji Konwertuj.

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

Możesz przejrzeć różne opcje formatów dat here.

0

Ten błąd jest nadal obecny w Management Studio 2016, wydaje się, że na razie jedynym rozwiązaniem jest przesłać do varchar i żyć z nim, jeśli chcesz użyć projektanta zapytań.

+0

Nie - możesz faktycznie zapisać swój kod i przetestować go, uruchamiając widok spoza projektanta. (tzn. wybierz widok w eksploratorze obiektów i wykonaj od niego). – Paul

1

Możesz utworzyć funkcję i użyć jej, jeśli chcesz przekonwertować DATETIME na 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 

Następnie w widoku wywołaj funkcję konwertowania DATETIME.

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

Nie dostaniesz komunikatu o błędzie i można go użyć ponownie. (Testowane w SQL Server 2012)

Powiązane problemy