Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:仅将日期与月份和年份列进行比较_Sql_Sql Server_Tsql_Sql Server 2008r2 Express - Fatal编程技术网

SQL:仅将日期与月份和年份列进行比较

SQL:仅将日期与月份和年份列进行比较,sql,sql-server,tsql,sql-server-2008r2-express,Sql,Sql Server,Tsql,Sql Server 2008r2 Express,我有一张表MonthlyShipments,看起来像: partnumber | quantity | month | year | part1 | 12 | 6 | 2011 | part1 | 22 | 5 | 2011 | part1 | 32 | 4 | 2011 | part1 | 42 | 3 | 2011 | part1 | 52 |

我有一张表
MonthlyShipments
,看起来像:

partnumber | quantity | month | year |
part1      |       12 |     6 | 2011 |
part1      |       22 |     5 | 2011 |
part1      |       32 |     4 | 2011 |
part1      |       42 |     3 | 2011 |
part1      |       52 |     2 | 2011 |
where
  MonthlyShipments.Month <> MONTH(GETDATE()) AND 
  CAST(
    (CAST(MonthlyShipments.Month as nvarchar(2)) + 
    '-01-' + 
    CAST(MonthlyShipments.Year as nvarchar(4))) as DateTime)
  > DATEADD(m, -4, GETDATE())
我想把过去3个月的数量加起来,不包括本月。我的where子句当前看起来像:

partnumber | quantity | month | year |
part1      |       12 |     6 | 2011 |
part1      |       22 |     5 | 2011 |
part1      |       32 |     4 | 2011 |
part1      |       42 |     3 | 2011 |
part1      |       52 |     2 | 2011 |
where
  MonthlyShipments.Month <> MONTH(GETDATE()) AND 
  CAST(
    (CAST(MonthlyShipments.Month as nvarchar(2)) + 
    '-01-' + 
    CAST(MonthlyShipments.Year as nvarchar(4))) as DateTime)
  > DATEADD(m, -4, GETDATE())
在哪里
MonthlyShipments.Month月(GETDATE())和
铸造(
(以nvarchar(2)的形式铸造(每月装运)
'-01-' + 
铸造(月装运。年为nvarchar(4)))为日期时间)
>DATEADD(m,-4,GETDATE())
这很管用,但又丑陋又有侮辱性。有什么建议让它更漂亮吗?非常感谢

也好不到哪里去

DATEDIFF(
    month,
    DATEADD(Year, MonthlyShipments.Year-1900,
        DATEADD(Month, MonthlyShipments.Month-1, 0)
           ),
    GETDATE()
    ) BETWEEN 1 AND 3
但是,嵌套的DATEADD可以作为计算列和索引列

ALTER TABLE MonthlyShipments ADD
    ShipDate AS DATEADD(Year, MonthlyShipments.Year-1900,
            DATEADD(Month, MonthlyShipments.Month-1, 0)
               )

WHERE DATEDIFF(month, ShipDate, GETDATE()) BETWEEN 1 AND 3

可以添加日期列吗?如果您需要进行日期计算,并且不希望事情变得糟糕,那么这可能是一项要求。即使是一个简单的解决方案也会奏效

然后你可以这样做:

WHERE datecolumn < DATEADD(month, -3, GETDATE())
WHERE datecolumn
您可以将月份+日期转换为
日期
,然后将其与当前日期进行比较:

WHERE DATEDIFF(m,CONVERT(DATE, [month]+'/01/'+[year],101), GETDATE()) 
BETWEEN 1 AND 3
或者,正如其他人所说,您可以创建一个新的计算列来保存
日期
类型

如果您有
(年、月)
索引,我认为这将利用它:

FROM MonthlyShipments ms
WHERE ( ms.year = YEAR(GetDate()) 
        AND ms.month BETWEEN MONTH(GetDate())-3
                         AND MONTH(GetDate())-1
      )
   OR ( ms.year = YEAR(GetDate())-1
        AND ms.month BETWEEN 12 + MONTH(GetDate())-3
                         AND 12 + MONTH(GetDate())-1
      ) 

不过看起来不太漂亮。

即使是第一个也要好得多。。。简单地去掉字符串连接是更好的100倍:)您可以将其简化为单个DateAdd调用:
DateAdd(Month,(MonthlyShipments.Year-1900)*12+MonthlyShipments.Month-1,0)