SQL Server не может вызывать методы в дате - программирование
Подтвердить что ты не робот

SQL Server не может вызывать методы в дате

У меня есть столбец DATETIME в таблице SQL Server 2008 под названием ShiftDate. Я хочу преобразовать это в столбец DATE в запросе:

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

Я редактирую этот запрос в SSMS. Если я запускаю запрос в стандартном окне запроса, я не получаю никаких ошибок. Если я запустил это в окне редактора View, я получаю сообщение об ошибке "Can not Call Methods on Date".

Я пробовал метод 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 не увидит его как дату.

4b9b3361

Ответ 1

Вы правы, это ошибка в 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

Ответ 2

Кажется, что это настоящая ошибка, упомянутая выше https://stackoverflow.com/users/464923/will, унаследованная от старых страниц MS Access со всеми ее неудобствами. Вы должны просто игнорировать ошибку и сохраните свое представление, а затем запустите его в обычном окне SSMS, никакая ошибка не будет выбрана.

Ответ 3

Из моего опыта ошибка может быть проигнорирована. Просто сохраните представление и запросите его за окном Design/ "View editor" (в новом окне запроса), и он будет работать.

Ответ 4

Вы можете создать функцию и использовать ее, когда вам нужно преобразовать 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)

Ответ 5

Я могу предположить, что (ShiftDate AS DATE) должен иметь формат даты и времени. Если вы попробуете это:

CAST (CONVERT (DATE, ShiftDate) как Varchar)

Ответ 6

Иногда это работает...

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

(Да, я знаю, что это не дата, но на один шаг ближе)

В том же запросе он работал во внешнем select, но не внутри union all...

Не спрашивайте, почему: P

Ответ 7

Вместо этого вы можете использовать параметр "Конвертировать".

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

Вы можете посмотреть различные варианты форматов даты здесь.

Ответ 8

Эта ошибка по-прежнему присутствует в Management Studio 2016, похоже, пока единственное решение - бросить в varchar и жить с ней, если вы хотите использовать конструктор запросов.

Ответ 9

Проблема связана с именем ShiftDate атрибута в базовой таблице. При переименовании в то, что не содержит слова Date в качестве последних символов, представление работает. Попробуйте переименовать в ShiftDateDD, например.