在sqlServer中,我有一个较旧的数据库,无论出于何种原因,它将日期和时间存储在表的单独行中,以便我有
ID | ACTDate | ACTTime | NOTE
1 | 2016-02-17 00:00:00.000 | 1432 | Sold 4 boxes.
ACTDate
是DateTime
,ACTTime
是char(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总是在被查询的那天午夜。
因此,我需要一种在查询过程中组合列的方法。我已经研究了在查询过程中将列转换为类型的多种方法,但是这里我需要将它们组合起来然后转换它们,然后根据结果选择它们。对不起,我真的不知道从哪里开始。
感谢任何帮助!
答案 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())