MAX(Date)给出空结果

时间:2017-08-31 23:39:35

标签: mysql sql sql-server ssms

我有一张如下汇率的汇率表 enter image description here

我正在使用maxofdate根据货币代码选择所有这些值。但是查询是空白的。

Select USDAMOUNT * dbo.EXCHANGERATEAMT 
from dbo.Amount_monthly   
Left Join dbo.EXCHANGERATE on dbo.Amount_monthly.Currencycode=dbo.EXCHANGERATE.fromcurrencycode
WHERE ValidToDateTime = (Select MAX(ValidToDateTime) from dbo.EXCHANGERATE)
AND dbo.EXCHANGERATE.EXCHANGERATETYPECODE = 'DAY'

使用此声明

CONVERT(DATE,ValidToDateTime) = CONVERT(DATE,GETDATE()-1)

而不是子查询给了我预期的结果。 有人可以纠正这个。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

如果我理解正确,你需要两件事。首先,public class ExampleViewModel: NotificationObject { public ICommand AddNewCommand { get; } = new Microsoft.Practices.Prism.Commands.DelegateCommand(AddNew, CanAdd); // method references arn't static?? public String NewName { get; set; } = ""; internal bool CanAdd() { //Can Add if string is non empty & non null return !string.IsNullOrEmpty(NewName); } internal void AddNew() { var name = NewName ?? "NeedToCheckforNull"; var newWindSpeedEnv = new WindSpeedEnvelope() { Id = Guid.NewGuid(), Name = name }; } } 的条件需要匹配外部查询中的条件。其次,如果你真的想要max(),那么第二个表上的条件需要进入left join子句。

生成的查询如下所示:

on

我会使用窗口函数来编写它,但这是一个单独的问题。

答案 1 :(得分:0)

尝试删除ValidToDateTime的WHERE子句,并将其作为AND条件包含在JOIN中

SELECT USDAMOUNT * dbo.EXCHANGERATEAMT 
  FROM dbo.Amount_monthly   
  LEFT JOIN dbo.EXCHANGERATE 
    ON dbo.Amount_monthly.Currencycode = dbo.EXCHANGERATE.fromcurrencycode
   AND ValidToDateTime = (SELECT MAX(ValidToDateTime) --remove WHERE clause
                            FROM dbo.EXCHANGERATE)
   AND dbo.EXCHANGERATE.EXCHANGERATETYPECODE = 'DAY';

答案 2 :(得分:0)

我稍微清理了你的查询:正如其他人提到你需要关闭MAX(Date)子查询周围的括号,如果在WHERE子句中引用LEFT JOINed表,它的行为就像一个INNER加入,所以我换了INNER。您还将“dbo”作为字段前缀填充,但该(名称空间)仅作为数据库的前缀,而不是字段。我添加了IS NOT NULL检查只是为了避免SQL给出“null值被消除”的SQL警告。我在第一个表中使用了别名“am”,在第二个表中使用了“er”,这使得它更具可读性:

SELECT am.USDAMOUNT * er.EXCHANGERATEAMT
FROM dbo.Amount_monthly am
    JOIN dbo.EXCHANGERATE er
        ON am.Currencycode = er.fromcurrencycode
WHERE er.ValidToDateTime = (SELECT MAX(ValidToDateTime) FROM dbo.EXCHANGERATE WHERE ValidToDateTime IS NOT NULL)
    AND er.EXCHANGERATETYPECODE = 'DAY'

如果你像我一样偏执,你可能也想确保汇率不为零,以避免零除错误。

相关问题