3

我搜索了几个小时,发现了很多关于如何将日期时间字段转换为日期的信息。所有这些都在我的 SQL 窗口中运行良好。但是,我尝试在视图中使用它的那一刻它崩溃了。

版本:SQL Server v17.0

示例:
表中字段为:InvoiceDate(datetime,null)
数据为:2016-11-15 00:00:00.000

我的 SQL 代码是:

CONVERT(date,ihhd.InvoiceDate,101) AS InvoiceDate

我的 InvoiceDate 结果是:2016-11-15

当我将相同的代码放入视图中时,我得到了这个:

SQL 执行错误。
已执行 SQL SELECT [选定字段]
错误来源:.Net SqlClient 数据提供程序
错误消息:无法在日期调用方法。

我试图将其转换为 varchar:

CONVERT(varchar,ihhd.InvoiceDate,101) AS InvoiceDate

这不会在视图窗口中返回相同的错误。但是,将使用此数据的报告编写者不允许“类似日期”的比较,因此我需要日期格式的字段。

我也尝试过双重转换:

CONVERT(date,CONVERT(varchar,ihhd.InvoiceDate,101),101) AS InvoiceDate

SQL窗口再次正常,视图窗口抛出了同样的错误。

我究竟做错了什么?

4

3 回答 3

1

您正在将 DATETIME 转换为 DATE,因此它将产生预期的 yyyy-mm-dd。如果需要 MM/DD/YYYY,则需要转换为字符串。请记住,这个转换后的字符串不是日期,实际上应该降级到表示层。

Select AsString = convert(varchar(10),GetDate(),101)  -- notice the varchar(10)
      ,AsDate   = convert(date,GetDate(),101)

退货

AsString    AsDate
06/14/2017  2017-06-14

相反,您可以采用 MM/DD/YYYY 字符串并转换为日期

Select convert(date,'06/14/2017',101)   -- If 2012+ try_convert()

退货

2017-06-14
于 2017-06-14T17:42:18.887 回答
0

无法重现。

我刚刚在现有表中的 datetime 列上测试了这段代码:

CREATE VIEW vDT
AS 
SELECT CONVERT(date, [StartTime],101) AS tDate
FROM [dbo].[Trace20150811];

我没有出错,之后能够从视图中选择并获得预期的结果。

更仔细地检查您的代码,因为您收到错误的真正原因不在您发布的代码中。如果您找不到它,请发布您的完整视图代码而不进行任何更改。

于 2017-06-14T17:59:37.330 回答
0

多年来我一直遇到同样的问题。该代码在查询窗口、存储过程等中运行良好,但是当我在 View 中使用它时会出错。在视图中,CONVERT 函数适用于其他数据类型,但它不允许您转换为日期类型。如果我 CONVERT to VARCHAR(10) 那么它看起来很好,但如果你使用 Crystal 或 Excel 来检索数据,它不会将该字段视为 Date 类型,因此你不能进行日期过滤。

于 2021-08-17T20:41:36.627 回答