我需要将价格从当前6:00am
到第二天6:00am
(24hour
)汇总。问题是如果我的代码从6:00am
到24:00(00:00)
运行,如果我将其从24:01
运行到6:00am
该怎么办?
我应该为此创建两个例外,还是可以用一个代码运行它?
我的Sql
表格包含DateTime
列。
var date = DateTime.Now;
if ((date.Hour>=6&& date.Minute >0) && (date.Hour <= 24 && date.Minute < 59))
{
}
else if ((date.Hour>=0&& date.Minute >0) && (date.Hour <= 5 && date.Minute < 59))
{
}
或者,如果我可以使用sql
查询立即执行此操作?
SELECT SUM(sumtotal) from customertrans where DATEPART(HOUR, DateTime)>=6 and DATEPART(HOUR, DateTime)<=24 and DATEPART(HOUR, DateTime)=DATEPART(HOUR, GETDATE())
如果小时时间从24:00
到6:00
,我还需要在前一天6:00
到24:00
检查以下approch:
var date = DateTime.Now;
if ((date.Hour >= 6 && date.Minute >= 0) && (date.Hour <= 23 && date.Minute <= 59))
{
SqlCommand cmd = new SqlCommand("Select sum(sumTotal) from customertrans where datetime>='" + DateTime.Now.ToString("MM/dd/yyyy") + "' and DateTime >= DATEPART(HOUR, '6:00') ", con);
string test = cmd.ExecuteScalar().ToString();
MessageBox.Show(test);
}
else if ((date.Hour >= 0 && date.Minute >= 0) && (date.Hour <= 5 && date.Minute <= 59))
{
SqlCommand cmd = new SqlCommand("Select sum(sumTotal) datetime from customertrans where datetime>='" + DateTime.Now.AddDays(-1).ToString("MM/dd/yyyy") + "' and DateTime >= DATEPART(HOUR, '6:00') ", con);
string test = cmd.ExecuteScalar().ToString();
MessageBox.Show(test);
}
答案 0 :(得分:1)
从当天上午6:00到下一天上午6:00(24小时)
不正确。有些日子有23:00,有些日子有25:00,所以记住这一点。鉴于你是用C#调用它的,我觉得你用DATEPART做的事情有点奇怪。为什么不在DateTime上进行远程查询?如果该字段已编入索引,那么您将避免表扫描。
为什么不能这样:
TimeSpan cutoverTime = TimeSpan.FromHours(6); // or however you have this defined
// DateTime.Now is unstable, and the date may change between two consecutive calls
// so read it into a temporary variable
DateTime currentTime = DateTime.Now;
DateTime startTime = currentTime.Date.Add(cutoverTime); // guess today
if (startTime > currentTime)
{
// ok, guessed wrong, it was yesterday
startTime = startTime.AddDays(-1);
}
DateTime endTime = startTime.AddDays(1);
// And use parametised queries, not string concatenation (please)
// SELECT SUM(sumtotal) from customertrans where DateTime >= @startTime and DateTime < @endTime
另外一点需要注意的是,你可能需要考虑时区,可能会做一些关于UTCNow的事情。
答案 1 :(得分:0)
在where语句中使用它。
WHERE date BETWEEN FORMAT(GETDATE(), 'MM/dd/yyyy') + ' 06:00' AND FORMAT(GETDATE() + 1, 'MM/dd/yyyy') + ' 06:00'
这会以MM/dd/yyyy
格式格式化当前日期,然后将上午6:00的时间添加到它(开始日期),然后执行相同操作但添加1
(添加1
这是为了让明天约会。
对于SQL 2008
,你可以这样做:
where date BETWEEN CONVERT(VARCHAR(10), GETDATE(), 110) + ' 06:00' AND CONVERT(VARCHAR(10), GETDATE() + 1, 110) + ' 06:00'
答案 2 :(得分:0)
你可以试试这个
DateTime start = date.Date.AddHours(6);
if ((date.Hour >= 6 && date.Minute >= 0) && (date.Hour <= 23 && date.Minute <= 59))
{
sum = Sum(start, start.AddDays(1));
}
else if ((date.Hour >= 0 && date.Minute >= 0) && (date.Hour <= 5 && date.Minute <= 59))
{
sum = Sum(start.AddDays(-1), start);
}
你的sum方法声明为
public int Sum(DateTime start, DateTime end)