【问题标题】:How do I select distinct values between two dates如何在两个日期之间选择不同的值
【发布时间】:2023-03-11 15:56:01
【问题描述】:

我在两个日期之间选择两条记录,这样做时我遇到重复记录,我使用了 distinct 但它不起作用:这就是我的查询的样子:

public List<i> searchTwoDates(string firstDate, string secondDate)
{
    DateTime fdate = Convert.ToDateTime(firstDate);
    string realfirstDate = fdate.ToLongDateString();

    DateTime sdate = Convert.ToDateTime(secondDate);
    string realsecondDate = sdate.ToLongDateString();

    List<i> date = new List<i>();
    SqlConnection conn = new SqlConnection(....);
    SqlCommand command = new SqlCommand(@"SELECT distinct * From TableName WHERE Cast(columnName AS DATE) > @columnName AND CAST(columnName AS DATE) < @columnName1 ORDER BY columnName1 Desc", conn);
    command.Parameters.AddWithValue("@columnName", realfirstDate);
    command.Parameters.AddWithValue("@columnName2", realsecondDate);

    conn.Open();
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        Mod d = new Mod();
         here i get my column names....
        date.Add(d);
    }
    conn.Close();
    return date;
}

我的数据库中也有一个唯一 ID,因此我们可以使用它来检索唯一记录,但我将如何编写它?

目前我收到重复记录

ID  FName sName Date
1   John  JAck  2013-9-07
2   Linda Bush  2013-10-07
3   Linda Bush  2013-11-07
This is what i want
ID  FName sName  
1   John  JAck  2013-9-07
2   Linda Bush  2013-11-07

这是 2013-9-07 到 2013-11-07 之间的记录。在这些记录之间我不想要任何重复的 ID

【问题讨论】:

  • 您是否将日期时间作为字符串存储在数据库中?
  • 我将它存储为日期时间 - 但在这里我正在转换,所以它应该没问题
  • d 变量是什么?它没有在任何地方初始化。
  • 你能提供样品表和所需的输出吗?
  • 我看到您更新了您的问题,但仍不清楚。您是根据什么标准从这三行中选择这两行的?而且无论如何,你说你有一个唯一的ID,那怎么能重复呢?首先,您的数据库中有什么?

标签: c# sql


【解决方案1】:

[从 cmets 迁移而来]

您应该使用select distinct id, fname, sname from table。如果您不需要日期,那么这将起作用,无需重复。

【讨论】:

  • 这不起作用,除非您只选择 fname 和 sname,因为存在不同的 ID 和 Date 字段。见下文@user911
【解决方案2】:

试试这个

Select Max(ID),FName,sName,Max(Date)
FROM Table1
Where Date > 'SomeDate' And Date < 'SomeDate'
Group By FName,sName

【讨论】:

  • 使用这个,用户不能选择两个日期?
  • 它会给出你期望的结果,你可以使用 Between 关键字在两个日期之间进行选择
  • 我已经在我的数据库中尝试过,它可以工作,但是当涉及到 c# 时,它在 while(reader.Read()) 内停止,我收到错误消息,指出 ID 上的用户代码未处理 indexoutofrangeexception。我必须在某处指定 ID 吗?这就是我的查询的样子Select Max(ID),FName,sName,Max(Date) FROM Table1 Where Date &gt; @Date1 And Date &lt; @Date2 Group By FName,sName
【解决方案3】:

不要尝试使用BETWEEN

SELECT DISTINCT ID,FName,sName,Date
FROM Table1
WHERE Date BETWEEN 'Date1' And 'Date2'

更新

由于上述问题中有两个不同的日期和 ID,您应该使用分组。这给了你:

SELECT MIN(ID),FName,sName, MIN(Date)
FROM Table1
WHERE Date BETWEEN 'Date1' And 'Date2'
ORDER BY ID
GROUP BY FName,sName

DISTINCT 将不起作用,因为每条记录都有不同的 ID 和日期。

上述查询将为您提供第一个出现的 ID。您可以将 ORDER BY 更改为 Date 以获得最早的。或者你想要最新的然后使用 MAX 而不是 MIN 并使用 ORDER BYDESC

【讨论】:

  • 我仍然得到重复记录 Fname 和 Sname
  • 如上添加 DISTINCT 会发生什么?
猜你喜欢
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2019-11-01
  • 2015-07-08
  • 1970-01-01
相关资源
最近更新 更多