使用datetime转换的SQL select会抛出超出范围的错误

时间:2016-06-14 18:22:07

标签: c# sql-server datetime

我对SQLServer 2014

有以下SQL语句
SELECT        SUM(payment_amount) AS Expr1, CAST(DATEPART(hour, CONVERT(datetime, sales_time, 120)) AS int) AS Expr2, CAST(DATEPART(minute, CONVERT(datetime, sales_time, 120)) AS int) AS Expr3
FROM            sales_payment
WHERE        (CAST(DATEPART(hour, CONVERT(datetime, sales_time, 120)) AS int) > 15) AND (CAST(DATEPART(minute, CONVERT(datetime, sales_time, 120)) AS int) > 30) AND (CONVERT(datetime, CONVERT(varchar, date, 
                         126)) = '2016-06-14')
GROUP BY CAST(DATEPART(hour, CONVERT(datetime, sales_time, 120)) AS int), CAST(DATEPART(minute, CONVERT(datetime, sales_time, 120)) AS int)

基本上我想要实现的是SUM of all payments 14th of June 2016之后的3:30 PM

sales_timeNVARCHAR类型。

但是,从第1天到第12天,该命令在每个月的第13天之前的所有日期都能正常工作。但如果你在2016-06-14运行它将无法工作,而2016-06-10工作正常。

2 个答案:

答案 0 :(得分:5)

如果在每个月的第12天之后没有任何工作,那听起来很可疑,就像您的区域设置不是您认为的那样,您认为日期时间的日期部分实际上是月份部分。

通过尝试像“2016-14-06”(而不是“2016-06-14”)这样的字符串测试一下,看看你得到了什么。

顺便说一句,这部分问题是:

AND (CAST(DATEPART(minute, CONVERT(datetime, sales_time, 120)) AS int) > 30)

意味着您不会在下午4点到4点半之间获得任何结果。或者下午5点 - 下午5:30,依此类推。为什么不在指定日期的3:30之后使用一个过滤器来获取记录,而不是三个单独的过滤器导致这样的困难?

答案 1 :(得分:0)

您的标准是过滤掉小时大于下午3:00的任何内容,从而从下午4:00开始。然后它进一步说,只给我记录30分钟后的分钟。所以你得到的记录从下午4:30开始,如果他们在下半场,你只能得到它们。您可以检查小时和分钟的一种方法是将它们组合成一个数字并检查该数字是否大于1530.使用您的示例,您可以执行类似的操作。

SELECT SUM(payment_amount) AS Expr1
    ,CAST(DATEPART(hour, CONVERT(DATETIME, sales_time, 120)) AS INT) AS Expr2
    ,CAST(DATEPART(minute, CONVERT(DATETIME, sales_time, 120)) AS INT) AS Expr3
FROM #sales_payment
WHERE (DATEPART(hour, CONVERT(DATETIME, sales_time, 120)) * 100) + CAST(DATEPART(minute, CONVERT(DATETIME, sales_time, 120)) AS INT) > 1530
AND CONVERT(datetime, CONVERT(varchar(10), sales_time,120)) = '2016-06-14'
    GROUP BY CAST(DATEPART(hour, CONVERT(DATETIME, sales_time, 120)) AS INT)
        ,CAST(DATEPART(minute, CONVERT(DATETIME, sales_time, 120)) AS INT)