当日期和时间在单独的列中时从表中选择

时间:2016-10-15 21:28:16

标签: c# sql-server winforms

在sqlServer中,我有一个较旧的数据库,无论出于何种原因,它将日期和时间存储在表的单独行中,以便我有

ID  | ACTDate                 | ACTTime | NOTE
1   | 2016-02-17 00:00:00.000 | 1432    | Sold 4 boxes.

ACTDateDateTimeACTTimechar(4)

我希望能够从我的winForm应用程序(在c#中)查询过去X小时内的报告数量。所以我的查询是这样的:

DateTime startDate = DateTime.Now.AddHours(-numHoursToLookBack);
SELECT NOTE FROM myTable WHERE ACTDATE >= '" + startDate.ToString("yyyy-MM-dd HH:mm:ss.fff") + "' "

显然这不起作用,因为ACTDATE总是在被查询的那天午夜。

因此,我需要一种在查询过程中组合列的方法。我已经研究了在查询过程中将列转换为类型的多种方法,但是这里我需要将它们组合起来然后转换它们,然后根据结果选择它们。对不起,我真的不知道从哪里开始。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

当然正确的操作应该是统一日期和时间的一次性脚本,但是,如果这是不可能的话,那么你应该使用两个条件(这只有在你的时间与领先存储时才有效)零小于10的零点

 DateTime startDate = DateTime.Now.AddHours(-numHoursToLookBack);
 string initTime = startDate.ToString("hhmm");

 // This is just as an example because you haven't provided more context
 // but remember to never build query in this way. Use always parameters     
 SELECT NOTE FROM myTable WHERE ACTDATE >= '" + 
    startDate.ToString("yyyy-MM-dd") + "' AND ACTIME >= '" + 
    initTime + "'"

带参数

 string query = @"SELECT NOTE FROM myTable 
                 WHERE ACTDATE >= @date 
                 AND ACTIME >= @time";
 SqlCommand cmd = new SqlCommand(query, connection);
 cmd.Parameters.Add("@date", SqlDbType.Date).Value = startDate;
 cmd.Parameters.Add("@time", SqlDbType.Char, 4).Value = initTime; 
 // Execute the command

答案 1 :(得分:0)

你可以这样做:

where actdate + cast(stuff(acttime, 3, 0, ':') as time) >= dateadd(hour, - $HOURS, getdate())