SQL Server:从表中选择*,其中日期减去一年

时间:2018-09-29 11:53:38

标签: sql sql-server where

如何选择1年级?

这是我的代码:

select 
    a.* 
from 
    (select 
         met_men, kli_kod, pre_kod, galutinis, savik_group, marza, 
         KLR_KOD, KLI_POZ1, KLI_POZ2, KLI_POZ3, KLG_KOD, PRE_RUS, 
         PRE_POZ1, PRE_POZ2, PRE_POZ3, PRE_POZ4, PRE_POZ5, PRE_POZ6, 
         did_dat, savi_suproc, marza_suproc, pre_ska dbo.SVF_View_10) AS a 
left outer join 
    (select 
         pre_kod, kli_kod, met_men, did_dat 
     from 
         dbo.SVF_View_10_sum 
     where 
         dateadd(year, -1, 'did_dat')) as b on a.kli_kod = b.kli_kod 
                                            and a.pre_kod = b.pre_kod 
                                            and a.did_dat = b.did_dat

此错误发生在第where DATEADD(year, -1, 'did_dat')) as b行:

  

信息4145,第15级,状态1,第6行
  在需要条件的上下文中在')'附近指定的非布尔类型的表达式。

请帮助我

必填数据:订单日期,id,数量,orderdate-1年,数量。有必要比较今年和去年的销售量

3 个答案:

答案 0 :(得分:1)

您在单引号dateadd(year,-1,'did_dat')中给出列名,此处无需将其更改为dateadd(year,-1,did_dat),并且当您使用where子句时需要在where中进行比较操作条款。

已更改为

where did_dat <= dateadd(year, -1, did_dat)

但这没有任何意义,因为查询应该在上一年针对当前日期执行,例如

where did_dat <= dateadd(year, -1, GETDATE())

答案 1 :(得分:0)

我怀疑您想要的是什么

select . . .
from dbo.SVF_View_10 v left outer join
     dbo.SVF_View_10_sum vs
     on v.kli_kod = vs.kli_kod and a.pre_kod = b.pre_kod and
        v.did_dat = dateadd(year, -1, vs.did_dat);

注意:

  • 此查询不需要子查询。我认为它们只会使查询难以编写和阅读。
  • 使用表别名的缩写。
  • 您在where子句中有一个日期计算,而不是布尔表达式。那是造成您的错误。
  • 日期表达式的第三个参数具有 string 。这将是您的下一个错误。字符串不引用列名。
  • 我推测您希望在该日期表达式中加入表。

答案 2 :(得分:0)

尝试一下:-

SELECT a.*
    FROM
    (
        SELECT met_men,kli_kod,pre_kod,galutinis,savik_group,marza,KLR_KOD,LI_POZ1,
               KLI_POZ2,KLI_POZ3,KLG_KOD,PRE_RUS,PRE_POZ1,PRE_POZ2,PRE_POZ3,PRE_POZ4,
               PRE_POZ5,PRE_POZ6,did_dat,savi_suproc,marza_suproc,pre_ska
        FROM SVF_View_10_sum
    ) AS a
        LEFT OUTER JOIN
        (
            SELECT pre_kod,kli_kod,met_men,did_dat
            FROM dbo.SVF_View_10_sum
            WHERE did_dat = DATEADD(YEAR, -1, did_dat)
        ) AS b
            ON a.kli_kod = b.kli_kod AND a.pre_kod = b.pre_kod AND a.did_dat = b.did_dat;