Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有日期时间转换的SQL select抛出范围外错误_C#_Sql Server_Datetime - Fatal编程技术网

C# 带有日期时间转换的SQL select抛出范围外错误

C# 带有日期时间转换的SQL select抛出范围外错误,c#,sql-server,datetime,C#,Sql Server,Datetime,我有以下针对SQLServer2014的SQL语句 基本上,我试图实现的是获得2016年6月14日下午3:30后所有付款的总和 列sales_time是NVARCHAR类型 但是,从第1天到第12天,该命令在13日之前的每个月的所有日子都可以正常工作。但是如果你运行2016-06-14,它将不起作用,而2016-06-10运行良好。如果每个月的第12天之后没有任何事情起作用,听起来很可疑,你的区域设置与你想象的不一样,你认为日期时间的日部分实际上是月部分 通过尝试类似2016-14-06而不是2

我有以下针对SQLServer2014的SQL语句

基本上,我试图实现的是获得2016年6月14日下午3:30后所有付款的总和

列sales_time是NVARCHAR类型


但是,从第1天到第12天,该命令在13日之前的每个月的所有日子都可以正常工作。但是如果你运行2016-06-14,它将不起作用,而2016-06-10运行良好。

如果每个月的第12天之后没有任何事情起作用,听起来很可疑,你的区域设置与你想象的不一样,你认为日期时间的日部分实际上是月部分

通过尝试类似2016-14-06而不是2016-06-14这样的字符串来测试这一点,看看你得到了什么

顺便说一下,您的查询的这一部分:

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

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

如果每个月的第12天之后什么都不起作用,那么听起来你的区域设置与你想象的不一样,而你认为的日期时间的日部分实际上是月部分

通过尝试类似2016-14-06而不是2016-06-14这样的字符串来测试这一点,看看你得到了什么

顺便说一下,您的查询的这一部分:

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

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

您的标准是过滤时间大于下午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)

您的标准是过滤时间大于下午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)


看看14号的记录。。。其中一条记录上可能有一个格式不正确的日期。“2016-06-15”有效吗?你在哪个时区?@DazedandMiddle,所有记录都很好,我逐一查看record@user3378165不,在每个月的第12天之后什么都没有。看看第14天的记录。。。其中一条记录上可能有一个格式不正确的日期。“2016-06-15”有效吗?你在哪个时区?@DazedandMiddle,所有记录都很好,我逐一查看record@user3378165不,每个月的第12天之后什么都没有。谢谢你的回复,我试了2016-14-06,也没用。您好,谢谢您的回复,我试了2016-14-06,也没用,只是没有记录。与2016-06-12不同,2016-06-12运行良好。但一旦到了2016-06-13或超过12天,它就会超出范围。过滤器背后的原因是只在下午3:30到4:00之间获取记录,如果“2016-14-06”没有错误,但“2016-06-13”确实有错误,那么这就意味着“2016-14-06”是格式化字符串的正确方式,并且在6月14日没有任何记录。这似乎是你的答案。谢谢你的回复,我在1日到16日有记录,但一旦我查询2016-05-06,我得到的是5月6日的记录,而不是6月5日的记录。奇怪的是,还有一件事需要补充,如果我查询一个仍然没有记录的日期,它不会抛出错误,只是显示空的网格窗格供您回复,我尝试了2016-14-06,但它根本不起作用。您好,谢谢您的回复,我尝试了“2016-14-06”,但也没有起作用,它根本没有记录。与2016-06-12不同,2016-06-12运行良好。但一旦到了2016-06-13或超过12天,它就会超出范围。过滤器背后的原因是只在下午3:30到4:00之间获取记录,如果“2016-14-06”没有错误,但“2016-06-13”确实有错误,那么这就意味着“2016-14-06”是格式化字符串的正确方式,并且在6月14日没有任何记录。这似乎是你的答案。谢谢你的回复,我在1日到16日有记录,但一旦我查询2016-05-06,我得到的是5月6日的记录,而不是6月5日的记录。Str
ange thing还有一点需要补充,如果我查询一个仍然没有记录的日期,它不会抛出错误,只是显示空的网格窗格供您回复,即使使用任何月份的12号以下的日期,此命令也会返回超出范围。谢谢您的回复,即使使用任何月份的12号以下的日期,此命令也始终返回超出范围。