繁体   English   中英

如何从6:00 am到第二天6:00 am求和

[英]How to Sum Price from 6:00am till next day 6:00am

我需要对当日6:00am至次日凌晨6:00am24hour )的价格求和。 问题是,如果从6:00am24:00(00:00)运行我的代码,如果从24:016: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:006:00我还需要添加前一天的从6:0024:00

在下面检查此方法:

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);
        }

从当日6:00 am至第二天6:00 am(24hour)

不对。 有些日子有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做些事情。

在您的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'

你可以试试这个

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM