【问题标题】:Max(datetime) ignore secondsMax(datetime) 忽略秒数
【发布时间】:2016-10-28 09:14:50
【问题描述】:

我的 sql 查询可以正常工作,但是当我找到具有相同小时和分钟的日期时,我无法使查询正常工作。例如:

在“trans_date”列上,我无法使用我的查询,因为使用 max(trans_date) 我没有得到任何结果,不知何故 sql 忽略了秒数。

这是我完整的sql语句:

SELECT till.code,art.description
FROM [TCPOS4].[dbo].[transactions] as tra,
TCPOS4.dbo.articles as art,[TCPOS4].[dbo].[trans_articles] as tro,
[TCPOS4].[dbo].[tills] as till,[TCPOS4].[dbo].[shops] as shop 
where tra.till_id=till.id and shop.id=till.shop_id and tro.transaction_id=tra.id and  
art.id=tro.article_id  and tra.trans_date =(select max(trans_date) 
from tcpos4.dbo.transactions as t2 where t2.till_id=tra.till_id  and  trans_date  > '2016-10-26 00:00:0.000' and trans_date< '2016-10-27 00:00:00.000' )
group by till.code,art.description 

通过此查询,我从 2016 年 10 月 26 日到 2016 年 10 月 27 日的每个“代码”都获得了最大交易日期,但我没有从代码“5446”中获得任何信息。我应该得到“TABLE CHOCOLECHE-CONGUITOS”,因为它是该范围内的最大 trans_date。

【问题讨论】:

  • 是 '2016-10-26 00:00:0.000' 到 '2016-10-27 00:00:00.000' 范围内的 trans_date 吗?你没有得到的那一行是什么日期?
  • 我猜问题出在INNER JOINs 附近。倾向于使用显式连接语法而不是老式连接“通过逗号和谓词在哪里”。
  • 该行的日期是图片的第一个,与另一个几乎相同的日期。我认为问题就在那里,因为我一直在试验并且出现错误我有相同的小时和分钟。好吧,我没有错误,查询只是忽略代码'5446'

标签: sql-server datetime group-by max


【解决方案1】:

您可以尝试以下不同的方法吗?

SELECT code, description
 FROM
 (
  SELECT till.code, art.description,
    row_number() OVER (PARTITION BY till.code ORDER BY trans_date DESC) RowNum
   FROM [TCPOS4].[dbo].[transactions] AS tra
   LEFT JOIN [TCPOS4].[dbo].[tills] AS till
    ON tra.till_id=till.id
   LEFT JOIN [TCPOS4].[dbo].[shops] AS shop
    ON shop.id=till.shop_id
   LEFT JOIN [TCPOS4].[dbo].[trans_articles] AS tro
    ON tro.transaction_id=tra.id
   LEFT JOIN TCPOS4.dbo.articles AS art
    ON art.id=tro.article_id
 ) sbt
 WHERE RowNum=1

这样,即使您有相同的确切日期,您也会为每个 till.code 获得一个结果。

如果需要,您可以在 ORDER BY 中添加更多字段。

编辑:删除 PARTITION BY 中的 art.description。

编辑 2:使用 LEFT JOIN 转换

【讨论】:

  • 您可以尝试删除 PARTITION BY 中的 art.description 吗?
  • 还是一样。
  • 我不得不说我没有像图片那样得到两行,我什么也没得到。好吧,我得到了分组的其他代码,但没有代码'5446'
  • 您的方法就像使用内部联接。我在回答中使用 LEFT JOIN 对其进行了编辑。你能测试一下,看看它是否显示任何带有 NULLS 的行吗?如果是的话,把LEFT替换掉,把INNER一个一个放上去试试看结果有没有变化。
【解决方案2】:

试试

...CAST(tra.trans_date AS DATE) = (select CAST(max(trans_date) AS DATE)...

【讨论】:

  • 您需要进行试验,删除一些条件并找出阻止它出现的条件 - 我们几乎没有信息可以继续 - 它是导致它不出现的其他条件之一 -如果您完全删除日期条件,或者使其始终为真,那么该行是否出现在列表中?
  • 我一直在尝试查询,我意识到问题出在日期上。这个查询对我有用,我只有在一行中的小时和分钟相同时才会遇到问题。 max(date) 忽略了我的 datetype 中的秒数,不知道为什么。
  • > '2016-10-26 00:00:0.000' 实际上必须大于确切的日期。出错时实际存在哪些时间值?
  • 我明白了,所以某种舍入导致 tra.trans_date =(select max(trans_date) .. 找到新记录,即使该记录必须存在 - 你可以使用其中一种格式吗更改为文本格式的命令?这听起来令人担忧
  • 您没有在 select max(trans_date) 上使用任何别名 - 我会检查是否可以
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 2021-11-24
  • 2014-06-25
相关资源
最近更新 更多