SQL Server:搜索不同月份的事件

时间:2017-11-02 14:39:20

标签: c# sql sql-server

我正在尝试使用Visifire来显示图表数据的项目。它需要一个DataTable。我需要创建一个SQL查询,搜索特定月份的日期列(格式为:2017年11月3日星期五),然后存储该月重复的次数。它必须在所有12个月内完成。这是在Visual Studio的C#中完成的。目前,它在折线图上不显示任何数据。

public DataTable ReadDataMonthlyBooked()
{
    // Declare references (for table, reader and command)
    DataTable monthlyBookedTable = new DataTable();

    SqlDataReader reader;
    SqlCommand command;

    string selectString = "SELECT COUNT (BookingNum) AS Bookings "
                            + "FROM Booking "
                            + "WHERE Booking.EndDate LIKE  'January' "
                            + "AND Booking.EndDate LIKE 'February' "
                            + "AND Booking.EndDate LIKE 'March' "
                            + "AND Booking.EndDate LIKE 'April' "
                            + "AND Booking.EndDate LIKE 'May' "
                            + "AND Booking.EndDate LIKE 'June' "
                            + "AND Booking.EndDate LIKE 'July' "
                            + "AND Booking.EndDate LIKE 'August' "
                            + "AND Booking.EndDate LIKE 'September' "
                            + "AND Booking.EndDate LIKE 'October' "
                            + "AND Booking.EndDate LIKE 'November' "
                            + "AND Booking.EndDate LIKE 'December'";

    try
    {
        // Create a new command
        command = new SqlCommand(selectString, cnMain);         

        // open the connection  
        cnMain.Open();                                          

        command.CommandType = CommandType.Text;                   
        reader = command.ExecuteReader();

        // read data from readerObject and load in table                  
        monthlyBookedTable.Load(reader);
        reader.Close();     //close the reader 
        cnMain.Close();     //close the connection

        return monthlyBookedTable;
    }
    catch (Exception ex)
    {
        return (null);
    }
}

这是我当前的SQL查询,我希望它的逻辑错误无可救药,但我不太了解SQL。

3 个答案:

答案 0 :(得分:0)

错误发生在您的SQL语句中。

IEnumerable<int> c = codigo_incidencia.Split('#').Select(stringValue => int.Parse(stringValue));

你试图在同一时间记录一年中每个月的月份。

如果我是对的,你会尝试每月获得预订数量。

所以看起来应该更像是

SELECT 
    COUNT(BookingNum) AS Bookings 
FROM 
    Booking 
WHERE 
        Booking.EndDate LIKE '%January%',
    AND Booking.EndDate LIKE '%February%',
    AND Booking.EndDate LIKE '%March%',
    AND Booking.EndDate LIKE '%April%',
    AND Booking.EndDate LIKE '%May%',
    AND Booking.EndDate LIKE '%June%',
    AND Booking.EndDate LIKE '%July%',
    AND Booking.EndDate LIKE '%August%', 
    AND Booking.EndDate LIKE '%September%',
    AND Booking.EndDate LIKE '%October%',
    AND Booking.EndDate LIKE '%November%',
    AND Booking.EndDate LIKE '%December%',

答案 1 :(得分:0)

选择'2017年11月3日星期五'

SELECT 
    SUM(CASE WHEN Booking.EndDate LIKE '%January%' THEN 1 ELSE 0 END) AS JanuaryBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%February%'  THEN 1 ELSE 0 END) AS FebruaryBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%March%'  THEN 1 ELSE 0 END) AS MarchBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%April%'  THEN 1 ELSE 0 END) AS AprilBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%May%' THEN 1 ELSE 0 END) AS MayBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%June%'  THEN 1 ELSE 0 END) AS JuneBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%July%'  THEN 1 ELSE 0 END) AS JulyBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%August%'  THEN 1 ELSE 0 END) AS AugustBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%September%' THEN 1 ELSE 0 END) AS SeptemberBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%October%'  THEN 1 ELSE 0 END) AS OctoberBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%November%'  THEN 1 ELSE 0 END) AS NovemberBookings,
    SUM(CASE WHEN Booking.EndDate LIKE '%December%' THEN 1 ELSE 0 END) AS DecemberBookings
FROM 
    Booking

答案 2 :(得分:0)

你需要一个像这样的小组

SELECT COUNT(BookingNum) as Bookings, MONTH(EndDate) as Month
FROM Booking
GROUP BY MONTH(EndDate)

但是,由于您的EndDate是varchar,您必须提取月份

SELECT COUNT(BookingNum) as Bookings
     , SUBSTRING(EndDate, 
                 CHARINDEX(',',EndDate) + 4, 
                 CHARINDEX(' ',EndDate, CHARINDEX(',',EndDate) + 5) - CHARINDEX(',',EndDate) + 4)
FROM Booking
GROUP BY SUBSTRING(EndDate, 
                 CHARINDEX(',',EndDate) + 4, 
                 CHARINDEX(' ',EndDate, CHARINDEX(',',EndDate) + 5) - CHARINDEX(',',EndDate) + 4)

可能有一种更好的方法可以做到这一点(游标可能?)但基本上你想获得第一个','的位置,并添加4来获得月份(假设日期总是2个数字,就像你的例子中一样)然后使用它作为搜索第一个空白的起始索引(这将是月份名称的结尾)并减去我们找到的第一个索引以获得该月的长度。

所以,基本上,只需将日期更改为DATE字段即可 或者施展它

SELECT COUNT(BookingNum) as Bookings, MONTH(CONVERT(DATE, EndDate)) as Month
FROM Booking
GROUP BY  MONTH(CONVERT(DATE, EndDate))

但我不知道您使用的格式是否会由引擎正确解释。