首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据类型varchar转换为日期时间时出错。存储过程和两个函数

将数据类型varchar转换为日期时间时出错。存储过程和两个函数
EN

Stack Overflow用户
提问于 2022-06-02 16:30:06
回答 1查看 159关注 0票数 0

Msg 8114,级别16,状态1,过程sp_wl_CalculateWorklistItemGroupTypeCurrentStats,行0批开始行619错误,将数据类型varchar转换为日期时间。

代码语言:javascript
复制
 exec sp_wl_CalculateWorklistItemGroupTypeCurrentStats @Practice_ID=20217,@WorkingDate='2022-06-02 14:59:04.4250000',@All=0

如何处理这种类型的日期WorkingDate?

我试过的是:

代码语言:javascript
复制
ALTER PROCEDURE [dbo].[sp_wl_CalculateWorklistItemGroupTypeCurrentStats] (
  @Practice_ID bigint,
  @WorkingDate datetime = NULL,
  @All bit = 0
)
AS 

  SELECT 
    WLIT.WorklistItemGroupTypeIdentify as ID,
    WLIT.Name as Prefix, 
    dbo.fn_wl_CalculateWorklistItemGroupTypeCurrentLoad(@Practice_ID, WLIT.WorklistItemGroupTypeIdentify, @WorkingDate) as CurrentLoad,
    dbo.fn_wl_CalculateWorklistItemGroupTypeCurrentCapacity(@Practice_ID, WLIT.WorklistItemGroupTypeIdentify, @WorkingDate ) as MaxCapacity
  FROM WorklistItemGroupType WLIT
  WHERE WLIT.PracticeIdentify = @Practice_ID
  AND WLIT.ReportOn = CASE @All WHEN 1 THEN WLIT.ReportOn ELSE 1 END

下面是返回Currentload结果的第一个函数。它们是数值。

代码语言:javascript
复制
ALTER FUNCTION [dbo].[fn_wl_CalculateWorklistItemGroupTypeCurrentCapacity] (
  @Practice_ID bigint,
  @GroupType_ID int,
  @WorkingDate datetime = NULL
)
RETURNS INT
AS
BEGIN 
  DECLARE @GlobalCapacity int = 0, @DayCapacity int = 0, @InstanceCapacity int = 0, @Result int = -1

  IF ISNULL(@WorkingDate, -1) = -1
    SET @WorkingDate = GETDATE()

  SET @WorkingDate = CAST(@WorkingDate as DATE) --remove time from datetime

  -- get capacity
  SELECT @GlobalCapacity = W.MaxCapacity, 
    @DayCapacity = CASE (@@datefirst - 1 + datepart(weekday, @WorkingDate)) % 7
      WHEN 0 THEN SundayCapacity
      WHEN 1 THEN MondayCapacity
      WHEN 2 THEN TuesdayCapacity
      WHEN 3 THEN WednesdayCapacity
      WHEN 4 THEN ThursdayCapacity
      WHEN 5 THEN FridayCapacity
      WHEN 6 THEN SaturdayCapacity
    END,
    @InstanceCapacity = COALESCE(Ext.MaxCapacity, 0)
  FROM WorklistItemGroupType W
  LEFT OUTER JOIN (SELECT TOP 1 WLIGTIdentify, MaxCapacity
                   FROM WorklistItemGroupTypeExtension 
                   WHERE WLIGTIdentify = @GroupType_ID
                   AND @WorkingDate BETWEEN TargetDateStart AND TargetDateEnd) as Ext ON (W.WorklistItemGroupTypeIdentify = Ext.WLIGTIdentify)
  WHERE WorklistItemGroupTypeIdentify = @GroupType_ID
  AND PracticeIdentify = @Practice_ID

  IF @InstanceCapacity > 0
    SET @Result = @InstanceCapacity
  ELSE IF @DayCapacity > 0
    SET @Result = @DayCapacity
  ELSE IF @GlobalCapacity > 0
    SET @Result = @GlobalCapacity;

  RETURN @Result
END

以下是第二个函数。预期将返回当前的最大容量。

代码语言:javascript
复制
ALTER FUNCTION [dbo].[fn_wl_CalculateWorklistItemGroupTypeCurrentLoad] (
  @Practice_ID bigint,
  @GroupType_ID int,
  @WorkingDate datetime = NULL
)
RETURNS INT
AS
BEGIN 
  DECLARE @CurrentLoad int = -1

  IF ISNULL(@WorkingDate, -1) = -1
    SET @WorkingDate = GETDATE()

  SET @WorkingDate = CAST(@WorkingDate as DATE) --remove time from datetime
  
  --get current load
  SELECT @CurrentLoad = COUNT(WLI.WorkListItemIdentify)
  FROM WorkListItem WLI
  INNER JOIN WorklistItemType WLIT ON (WLI.ItemTypeIdentify = WLIT.WorklistItemTypeIdentify) AND (WLIT.GroupTypeIdentify = @GroupType_ID)
  WHERE WLI.DateCreated BETWEEN @WorkingDate AND @WorkingDate + '23:59:59.997'
  AND WLI.PracticesIdentify = @Practice_ID
  AND WLI.Deleted = 0

  RETURN @CurrentLoad
END
EN

回答 1

Stack Overflow用户

发布于 2022-06-02 16:32:41

日期文字末尾的0太多了。把它们移开,你就会没事的。

代码语言:javascript
复制
@WorkingDate='2022-06-02 14:59:04.425'

此外,还包括:

代码语言:javascript
复制
WLI.DateCreated BETWEEN @WorkingDate AND @WorkingDate + '23:59:59.997'

应该是这样:

代码语言:javascript
复制
WLI.DateCreated >= @WorkingDate AND WLI.DateCreated < DATEADD(day, 1, @WorkingDate)

最后,不是一个bug,但我会减少所有这些:

代码语言:javascript
复制
IF ISNULL(@WorkingDate, -1) = -1
  SET @WorkingDate = GETDATE()

SET @WorkingDate = CAST(@WorkingDate as DATE) --remove time from 
datetime

到目前为止:

代码语言:javascript
复制
Set @WorkingDate = CAST(COALESCE(@WorkingDate, current_timestamp) as Date)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72479441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档