【问题标题】:Can't convert Datetime to Int无法将 Datetime 转换为 Int
【发布时间】:2014-06-30 15:03:56
【问题描述】:

我正在尝试使用此存储过程根据两个值来SELECT 行:

ALTER PROCEDURE [dbo].[MYSelect]

    -- Parameters with default values
    @MitarbeiterId          AS int,
    @Wann                   AS datetime2(7)

AS

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
        SET NOCOUNT ON;

        SELECT  *
        FROM    [Plan] 
        WHERE   RefMitarbeiterId    =   @MitarbeiterId
        AND     Jahr                <=  YEAR(@Wann)
        AND     Monat               <=  MONTH(@Wann)
        AND     Abgeschlossen       =   0

问题出在以下部分:

        AND     Jahr                <=  YEAR(@Wann)
        AND     Monat               <=  MONTH(@Wann)

我不知道为什么这部分会导致(语法)问题。包含这些行后,使用 MSSQL Studio,我收到错误 unable to convert DateTime to Integer。删除这些返回结果并且没有语法错误。我在其他地方使用YEAR()MONTH(),所以我很困惑为什么这里有问题。

这是Plan 表:

【问题讨论】:

  • 问题出在哪里?

标签: sql stored-procedures sql-server-2012


【解决方案1】:

条件

AND  Jahr <=  YEAR(@Wann)
AND  Monat <= MONTH(@Wann)

将条件分隔为年和月。

这并不意味着年份和月份小于参数,而是年份小于或等于参数的年份并且月份小于或等于参数的月份范围。

使用今天 (2014-06-30) 作为参数,您的查询将返回过去和当前年份 Monat 介于 1 和 6 之间的每一行:例如,不会返回 2013 年 12 月的行。

要获取参数日期之前的所有行,您需要将条件更改为

AND  ((Jahr = YEAR(@Wann) AND  Monat <= MONTH(@Wann))
   OR  Jahr < YEAR(@Wann))

【讨论】:

  • mhh,我也以不同的方式使用相同的参数执行该过程。如果您使用 View 运行它会给出此错误的过程,它看起来像一个错误,但如果您通过 EXEC 运行它,它可以正常工作
【解决方案2】:

在测试了运行此程序的不同方式后,
如果您在 SQL Server Manangement Studio

中使用带有日期时间参数的视图,我现在认为这是一个错误

因为我测试过

执行


效果很好

然后删除我的参数


这会返回一个错误,告诉我它无法将 '01.07.2014 00:00:00' 转换为日期时间,但它返回正确的行

如果我现在用我的参数再做一次并添加我的值

我得到一个异常,它告诉我与上面的错误相同的想法,所以我必须删除',然后我得到unable to convert DateTime to Integer,在我看来这是一个错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多