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 не увидит его как дату.
Ответы
Ответ 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, например.