【问题标题】:Syntax with SQL script replacing date value with null使用 SQL 脚本将日期值替换为 null 的语法
【发布时间】:2016-02-04 08:08:53
【问题描述】:

我需要打印一个空白而不是1900-01-01 SQL 默认值。我有一个案例,当语句编写并试图将其插入我们的存储过程中时。当我插入它时,它会引发一堆错误。

case when 语句应该放在存储过程中的什么位置以产生我们正在寻找的结果?还是有其他错误?

如果有更简洁的方法可以做到这一点,我也愿意。

SELECT
    tsd.PACOSTCATID, cc.PACOSTCATNME,convert(varchar(10),MAX(padt),101) + ' - ' + convert(varchar(10),MAX(PAexptdate),101) DateRange,tsh.EMPLOYID,TSD.PAQtyQ
    tsd.padt, 
    case when convert(date, padt) = '1900-01-01'
    then ''
    ELSE convert(varchar(10),MAX(padt),101) +''+
    CONVERT (CHAR(8), padt, 120)
    END,

    tsd.PAexptdate,
    case when convert (date, PAexptdate) = '1900-01-01'
    then ''
    ELSE convert(varchar(10), PAexptdate,101)+''+
    convert (CHAR(8),paexptdate, 120)
    END

这是存储过程:

USE 
GO
/****** Object:  StoredProcedure [dbo].[dd_PA01201_SEL]    Script Date: 11/03/2015 14:28:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER proc [dbo].[dd_PA01201_SEL]

--  dd_PA01201_SEL 'sa'

@UserName varchar(30)
AS
select PAprojid, PABEndDate, pm.PAPROJNUMBER, e2.Extender_Record_ID, pm.CUSTNMBR,

        isnull(e1Client.STRGA255,'') as Client, 
        isnull(e1Union.STRGA255,'') as UnionName,
        pm.PAprjclsid, pm.PAprojname, 
        isnull(e3UsageFrom.DATE1,'') as UsageFrom , 
        isnull(e3UsageTo.DATE1,'') as UsageTo, 
        isnull(e3HoldFrom.DATE1,'') as HoldFrom, 
        isnull(e3HoldTo.DATE1,'') as HoldTo,
        isnull(e1ProductionCo.STRGA255, '') as ProductionCo,
        isnull(e2Signatory.STRGA255,'') as Signatory,
        isnull(ub.DateRange, '') as DateRange,
        isnull(ub.PACOSTCATNME,'') as PACOSTCATNME,
        isnull(ub.EMPLOYID,'') as EMPLOYID,
        100 * isnull(ub.PAQtyQ,0) as PAQtyQ
from UPR40200EXT ux
        join PA01201 pm on pm.PAPROJNUMBER = ux.projectnumber --Project Master
        left join EXT01100 e0 on e0.Extender_Window_ID = 'PROJECT_DETAILS' and e0.Extender_Key_Values_1 = pm.PAprojid --Extender Header
        left join EXT01100 e2 on e2.Extender_Window_ID = 'PROJ_SIGNATORY' and e2.Extender_Key_Values_1 = pm.CUSTNMBR --Extender Header
        left join EXT01101 e1Client on e1Client.Extender_Record_ID = e0.Extender_Record_ID and e1Client.Field_ID = 1290 --Extender client line
        left join EXT01101 e1Union on e1Union.Extender_Record_ID = e0.Extender_Record_ID and e1Union.Field_ID = 1299 --Extender union line
        left join EXT01102 e3UsageFrom on e3UsageFrom.Extender_Record_ID = e0.Extender_Record_ID and e3UsageFrom.Field_ID = 1269 --Extender usage from line
        left join EXT01102 e3UsageTo on e3UsageTo.Extender_Record_ID = e0.Extender_Record_ID and e3UsageTo.Field_ID = 1270 --Extender usage to line
        left join EXT01102 e3HoldFrom on e3HoldFrom.Extender_Record_ID = e0.Extender_Record_ID and e3HoldFrom.Field_ID = 1272 --Extender hold from line                          
        left join EXT01102 e3HoldTo on e3HoldTo.Extender_Record_ID = e0.Extender_Record_ID and e3HoldTo.Field_ID = 1274 --Extender hold to line
        left join EXT01101 e1ProductionCo on e1ProductionCo.Extender_Record_ID = e0.Extender_Record_ID and e1ProductionCo.Field_ID = 1290 --Extender ProductionCo line
        left join EXT01101 e2Signatory on e2Signatory.Extender_Record_ID = e2.Extender_Record_ID and e2Signatory.Field_ID = 1296 --Extender signatory line

              --THIS CAUSES THE STORED PROC TO RETURN ONE LINE FOR EACH PAYCODE
        left join (
              SELECT
                          tsd.PACOSTCATID, cc.PACOSTCATNME, tsh.EMPLOYID,TSD.PAQtyQ, 
                          convert(varchar(10),MAX(padt),101) + ' - ' + convert(varchar(10),MAX(PAexptdate),101) DateRange 
                    from UPR10301  ub
                          join PA30100 tsh on tsh.BACHNUMB = ub.BACHNUMB
                          join PA30101 tsd on tsd.PATSNO = tsh.PATSNO
                          join PA01001 cc on cc.PACOSTCATID = tsd.PACOSTCATID
                    where ub.MKDBYUSR = @UserName
                          and ub.UPRBCHMK = 1
                    group by ub.BACHNUMB,tsd.PACOSTCATID,cc.PACOSTCATNME, tsh.EMPLOYID,TSD.PAQtyQ
              ) ub on 1=1

--select * from EXT01100 where Extender_Window_ID = 'PROJ_SIGNATORY ' and Extender_Key_Values_1 = 'anot0001'

--select * from EXT01101 where Extender_Record_ID = 5194

--select * from pa01201

-- update UPR40200EXT set ProjectNumber = 'ALLI2C40094    '

【问题讨论】:

  • 请修正该格式,它很难阅读。您可以通过添加 4 个空格来获取代码样式格式。
  • @davejagoda 是对的。你的帖子真的很糟糕。如果你甚至没有花时间提出一个好问题,你很难要求别人的时间来帮助你。下次请自己做。此外,您正在写一些错误,但您没有在您的问题中发布它们,即使它是最重要的信息之一。你无法修复你不知道的错误。
  • 什么错误?进行一些基本的故障排除并单独测试你的案例语句的每个分支,以找出哪个引发了错误
  • 好的,感谢您的帮助。我知道格式很糟糕,我只是不知道如何修复它。显然我是新手——在这里学习和挣扎。但是感谢那些提供帮助的人。如果我无法弄清楚,我会尝试这些建议并发布错误。

标签: sql tsql syntax case


【解决方案1】:

您使用 CASE 语句的方式是正确的。问题不在于您在何处或如何使用它。问题是您有一个 GROUPBY 子句,并且在您的 CASE 语句中,您使用的列不是分组的一部分,也不是聚合的。

SELECT
    tsd.PACOSTCATID
    ,cc.PACOSTCATNME
    ,convert(varchar(10),MAX(tsd.padt),101) + ' - ' + convert(varchar(10),MAX(PAexptdate),101) DateRange
    ,tsh.EMPLOYID
    ,TSD.PAQtyQ
    ,MAX(tsd.padt)
    ,case when convert(date, MAX(tsd.padt)) = '1900-01-01' then ''
          ELSE convert(varchar(10),MAX(tsd.padt),101) +''+ CONVERT (CHAR(8), MAX(tsd.padt), 120)
     END
    ,MAX(tsd.PAexptdate)
    ,case when convert (date, MAX(tsd.PAexptdate)) = '1900-01-01' then ''
          ELSE convert(varchar(10), MAX(tsd.PAexptdate),101)+''+ convert (CHAR(8),MAX(tsd.PAexptdate), 120)
     END

如果你注意到了,我对 tsd.padt 和 tsd.paexptdate 使用了 MAX()。

【讨论】:

  • 这很有道理 - 谢谢。我会根据您的反馈尝试修复它。
猜你喜欢
  • 2015-03-19
  • 2021-04-04
  • 1970-01-01
  • 2013-08-03
  • 2017-04-03
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多