2014-04-02 58 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 
相關問題