【问题标题】:MSSQL Stored Procedure help comparing DatesMSSQL 存储过程帮助比较日期
【发布时间】:2018-07-23 15:50:58
【问题描述】:

我以前从未编写过存储过程。我正在使用 SSMS 2014,我正在尝试根据日期比较插入记录。

基本上如此。我想获取表 B 中的 MAX 日期。我想将它存储在某个地方,然后只插入表 A 中的记录,该表的日期大于表 B 的最大日期。我使用了错误的方法吗?我收到错误:聚合不能出现在 ON 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。

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

    -- Insert statements for procedure here
    SELECT * FROM dbo.Table1 A
    INNER JOIN dbo.Table2 B
    ON CONVERT(VARCHAR, A.LastDate, 101) > CONVERT(VARCHAR, MAX(B.LastDate), 101)

END

【问题讨论】:

  • 两大问题。首先,您永远不应该将日期转换为字符串进行比较。其次,如果你使用 varchar,你应该总是指定一个大小。对于手头的问题,似乎子查询或 cte 可能更适合手头的任务。
  • 我总是将 varchar 转换为日期,而不是将日期转换为字符串。
  • 不,您正在将 LastDate 列转换为 varchar(它是一个字符串)。
  • 你是对的。我的错。

标签: sql-server


【解决方案1】:

您可以如下实现:

如果需要插入数据可以直接使用Select ... Insert插入

DECLARE @MaxDate DATETIME;

SELECT @MaxDate = MAX(B.LastDate) FROM dbo.Table2 B

INSERT INTO dbo.Table2
SELECT * FROM dbo.Table1 A
WHERE A.LastDate > @MaxDate

【讨论】:

  • 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊我就是要把Insert之后的B去掉就不需要了。
【解决方案2】:

这里几乎是猜测,因为没有很多细节,但也许更像这样的东西就是您正在寻找的东西?您很可能需要关联子查询,但不确定您的要求是什么。

SELECT * 
FROM dbo.Table1 A
where A.LastDate >
(
    select max(B.LastDate)
    from dbo.Table2 B
)

【讨论】:

    【解决方案3】:

    由于您只需要 TableA 中的列,如 仅插入表 A 中日期大于表 B 最大日期的记录,因此您可以在联接中使用派生表。 p>

    SELECT A.* 
    FROM dbo.Table1 A
    INNER JOIN (select max(LastDate) DT from  dbo.Table2) b
    ON A.LastDate > b.DT
    

    或者在WHERE 子句中会更快。

    SELECT A.* 
    FROM dbo.Table1 A
    WHERE A.LastDate > (select max(LastDate) DT from dbo.Table2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2015-08-14
      相关资源
      最近更新 更多