如何从早上6点到次日早上6点结算价格

时间:2018-04-05 12:00:29

标签: c# sql-server-2008

我需要将价格从当前6:00am到第二天6:00am24hour)汇总。问题是如果我的代码从6:00am24: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:006:00,我还需要在前一天6:0024: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);
        }

3 个答案:

答案 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)