2014-04-02 140 views
0

我想弄清楚一种转换GetDate()的方式,只发送当前日期以及08:15和09:00之间的结果,此查询的目的是准确找出哪些员工在这些时间之间登录到系统中,但是每次尝试更改代码以便向我发送当前收到错误的日期。将GetDate()转换为具有特定时间的当前日期

private void button10_Click(object sender, EventArgs e) 
{ 
    DataTable dt = new DataTable(); 
    SqlConnection con = new SqlConnection(); 
    con.ConnectionString = @"Data Source=GTX-COMSVR2\SQLEXPRESS;Initial Catalog=Att;Persist Security Info=True;User ID=**;Password=********"; 
    //con.Open(); 
    SqlDataAdapter sda = new SqlDataAdapter(" SELECT USERINFO.USERID [User ID], USERINFO.BADGENUMBER [Employee No.], USERINFO.NAME [Name], CHECKINOUT.CHECKTIME [Clock Time], CHECKINOUT.CHECKTYPE [I/O], CHECKINOUT.SENSORID [Sensor ID] FROM USERINFO, CHECKINOUT WHERE USERINFO.USERID = CHECKINOUT.USERID and CHECKINOUT.CHECKTYPE = 'I' and CHECKINOUT.SENSORID = '1' and CHECKINOUT.CHECKTIME >= ('04/01/2014 08:15') and CHECKINOUT.CHECKTIME <= ('04/01/2014 09:00') ORDER BY CHECKTIME DESC ", con); 
    sda.Fill(dt); 
    dataGridView1.DataSource = dt; 
} 

正如你可以从代码中看到上面我还没有实现GETDATE()函数,每次我做的时候我收到了错误,我希望我的计划,以尽可能顺利运行。我目前在C#环境中有一年以上的开发和关闭编程经验,所以我理解如何解决许多问题,但在使用SQL Server时无法实现正确的代码。

感谢的人...

回答

0

为什么不能传递所需DateTime值从C#代码的参数?

更改代码到这个:

DateTime startTime = ...; 
DateTime endTime = ...; 

using (SqlCommand cmd = new SqlCommand("SELECT ... WHERE .. AND CHECKINOUT.CHECKTIME BETWEEN @startTime and @endTime ORDER BY CHECKTIME DESC ", con)) 
using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
{ 
    cmd.Parameters.AddWithValue("@startTime", startTime); 
    cmd.Parameters.AddWithValue("@endTime", endTime); 
    sda.Fill(dt); 
    dataGridView1.DataSource = dt; 
} 

在你的C#代码,你居然要查询的日期/时间设置startTimeendTime。例如:

startTime = new DateTime(2014, 04, 02, 08, 15, 0); 
endTime = new DateTime(2014, 04, 02, 09, 0, 0); 

startTime = DateTime.Now.Date.AddHours(8).AddMinutes(15); 
endTime = startTime.AddMinutes(45); 

按照要求,这是你的代码是什么样子:

private void button10_Click(object sender, EventArgs e) 
{ 
    DataTable dt = new DataTable(); 
    SqlConnection con = new SqlConnection(); 
    con.ConnectionString = @"..."; 

    //Query all entries between 08:15 and 09:00 today 
    DateTime startTime = DateTime.Now.Date.AddHours(8).AddMinutes(15); 
    DateTime endTime = startTime.AddMinutes(45); 

    // I use "using" to make sure command and data adapter are disposed of automatically 
    // I use a separate command so I can add the parameters more easily. 
    using (SqlCommand cmd = new SqlCommand("SELECT ... WHERE .. AND CHECKINOUT.CHECKTIME BETWEEN @startTime and @endTime ORDER BY CHECKTIME DESC ", con)) 
    using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
    { 
     // Pass in the two parameters to the query (note: I don't have to take care 
     // of any formatting here - aren't parameterized queries a treat? :-) 
     cmd.Parameters.AddWithValue("@startTime", startTime); 
     cmd.Parameters.AddWithValue("@endTime", endTime); 

     // Keep doing what you did before 
     sda.Fill(dt); 
     dataGridView1.DataSource = dt; 
    } 
} 
+0

你能告诉我这个例子使用我在问题中说明的代码,所以我可以理解这将如何工作更多(对不起,我现在在我的第三个咖啡) – MrBrownDXB

+0

我的意思是完全大声笑#badDay – MrBrownDXB

+0

当然,我会编辑我的答案:-)抢另一杯咖啡,等待一秒钟:-D –

0

应该仅仅是:

CHECKINOUT.CHECKTIME >= DATEADD(day,DATEDIFF(day,'20140401',GETDATE(), 
               '2014-04-01T08:15:00') and 
CHECKINOUT.CHECKTIME < DATEADD(day,DATEDIFF(day,'20140401',GETDATE(), 
               '2014-04-01T09:00:00') 

我也切换到使用<为终点,因为这通常是实际发生了什么希望(你通常会想即严格发生之前上午9点,并排除在上午9点发生

你不更改日期文字事件的事件。唯一重要的是关于它们之间的关系。因此,我们首先计算“2014年4月1日到目前的日期时间已经过了多少天”,然后我们在2014年4月1日08:15加上相同的天数 - 最终的结果是我们计算了今天的日期在08:15。

+0

是你的代码的第三行缺少“=”或者是正确的语法? – MrBrownDXB

+0

@MrBrownDXB - 我试着突出显示,就在代码下面,*为什么我改变了从<=比较到<<'比较。 –

-2

这应该适合你。所有最优秀的

SELECT USERINFO.USERID [User ID], USERINFO.BADGENUMBER [Employee No.], USERINFO.NAME [Name], CHECKINOUT.CHECKTIME [Clock Time], CHECKINOUT.CHECKTYPE [I/O], CHECKINOUT.SENSORID [Sensor ID] 
FROM USERINFO, CHECKINOUT 
WHERE USERINFO.USERID = CHECKINOUT.USERID 
    and CHECKINOUT.CHECKTYPE = 'I' 
    and CHECKINOUT.SENSORID = '1' 
    and CONVERT(varchar,CHECKINOUT.CHECKTIME,101) = CONVERT(varchar,GETDATE(),101) 
    and CONVERT(varchar, CHECKINOUT.CHECKTIME,108) BETWEEN '08:15:00' AND '09:00:00' 
ORDER BY CHECKTIME DESC 
+0

现在就试试这个...... – MrBrownDXB

+1

这不是一个好的样式,因为将列值转换为字符串完全破坏了服务器能够使用任何索引的任何可能性。 –

0
SELECT ... 
FROM ... 
    CROSS APPLY (
     SELECT DATEADD(day, 0, DATEDIFF(day, 0, GETDATE())) AS Today 
    ) AS CA1 
    CROSS APPLY (
     SELECT DATEADD(minute, 8*60+15, Today) AS StartTime 
       ,DATEADD(minute, 9*60, Today) AS EndTime 
    ) AS CA2 
WHERE CHECKINOUT.CHECKTIME BETWEEN StartTime AND EndTime 
0

,如果它是SQL Server 2008或以上

DECLARE @CurrentDate DATETIME 
SELECT @CurrentDate = CONVERT(DATE, GETDATE()) 

SELECT 
    USERINFO.USERID [User ID], 
    USERINFO.BADGENUMBER [Employee No.], 
    USERINFO.NAME [Name], 
    CHECKINOUT.CHECKTIME [Clock Time], 
    CHECKINOUT.CHECKTYPE [I/O], 
    CHECKINOUT.SENSORID [Sensor ID] 
FROM 
    USERINFO, 
    CHECKINOUT 
WHERE 
    USERINFO.USERID = CHECKINOUT.USERID 
    AND CHECKINOUT.CHECKTYPE = 'I' 
    AND CHECKINOUT.SENSORID = '1' 
    AND (CHECKINOUT.CHECKTIME BETWEEN (DATEADD (MINUTE, 495, @CurrentDate) AND DATEADD (MINUTE, 540, @CurrentDate))) 
ORDER BY CHECKTIME DESC 

- 或 -

SELECT USERINFO.USERID [User ID], USERINFO.BADGENUMBER [Employee No.], USERINFO.NAME [Name], CHECKINOUT.CHECKTIME [Clock Time], CHECKINOUT.CHECKTYPE [I/O], CHECKINOUT.SENSORID [Sensor ID] FROM USERINFO, CHECKINOUT WHERE USERINFO.USERID = CHECKINOUT.USERID AND CHECKINOUT.CHECKTYPE = 'I' AND CHECKINOUT.SENSORID = '1' AND (CHECKINOUT.CHECKTIME BETWEEN DATEADD (MINUTE, 495, CONVERT(DATETIME, CONVERT(DATE, GETDATE()))) AND DATEADD (MINUTE, 540, CONVERT(DATETIME, CONVERT(DATE, GETDATE()))))) ORDER BY CHECKTIME DESC 
相关问题