C# 在日期之间获取数据

C# 在日期之间获取数据,c#,sql-server,C#,Sql Server,所以,我想在mssql中检索两个日期之间的数据。我有一个表,名字是FILES。我有两列,名字是NAME,RECORDDATE(nvarchar)。当我保存数据时,我从raddatetimepicker.text获取数据,因此我的值为“2015年12月22日星期二” 我的问题是 select * from FILES where RECORDDATE>= '11 January 2015 Saturday' and RECORDDATE<= '24 October 2015 Monda

所以,我想在mssql中检索两个日期之间的数据。我有一个表,名字是FILES。我有两列,名字是NAME,RECORDDATE(nvarchar)。当我保存数据时,我从raddatetimepicker.text获取数据,因此我的值为“2015年12月22日星期二”

我的问题是

select * from FILES where RECORDDATE>= '11 January 2015 Saturday' and RECORDDATE<= '24 October 2015 Monday'
从RECORDDATE>='2015年1月11日星期六'和RECORDDATE的文件中选择*如果您的
RECORDDATE
实际上是数据库中的
DATETIME
字段,则以下为真。您当前将应该是
DATETIME
的内容存储为
NVARCHAR
立即停止此操作,并使用正确的类型

任何
DateTimePicker
都应该具有返回
DateTime
的属性。如果没有:将其转储并使用合适的。也就是说,您可以使用参数化查询正确地存储和查找记录

插入将如下所示:

DateTime recordDate = dtpDate.Value;
using (SqlCommand cmd = new SqlCommand("insert into FILES (NAME, RECORDDATE) VALUES (@name, @recorddate)", conn))
{
    cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = someName;
    cmd.Parameters.ADd("@recorddate", SqlDbType.DateTime).Value = recordDate;
    cmd.ExecuteNonQuery();
}
然后,查找查询归结为:

DateTime start = dtpStart.Value;
DateTime end = dtpEnd.Value;

using (SqlCommand cmd = new SqlCommand("select * from FILES where RECORDDATE BETWEEN @start and @end", conn))
{
    cmd.Parameters.Add("@start", SqlDbType.DateTime).Value = start;
    cmd.Parameters.Add("@end", SqlDbType.DateTime).Value = end;

    using (SqlDataReader reader = cmd.ExecuteReader())
        ...
}
这样做可以解决以下问题:

  • 如果使用
    String.Format
    或类似方法插入参数,则可以进行SQL注入
  • 不同的日期格式并不重要,因为.NET会将日期正确地转换为SQL server能够理解的格式

  • 实际上是字符串比较,而不是日期比较,因为RECORDDATE是NVARCHAR(unicode字符串)

    第一个字符串以“28..”开头,所以它比以“24”开头的字符串大,所以始终为false,因此为0行


    看看这个答案:

    因为将日期存储为字符串,所以您执行的是字符串比较,而不是日期比较。更新值后,您将在2015年1月28日星期二到2015年10月24日星期一之间检查字符串。如果值越小,则永远不会返回任何行

    如果要查找两个日期之间的值,最好将数据类型更改为
    DateTime

    如果不可能,则可以将列强制转换为
    DateTime
    ,例如

    SELECT * FROM FILES 
    WHERE RECORDDATE >= CAST('11 January 2015 Saturday' AS DATETIME) 
        AND RECORDDATE <= CAST('24 October 2015 Monday' AS DATETIME)
    
    从文件中选择*
    其中RECORDDATE>=CAST(日期时间为2015年1月11日星期六)
    
    和RECORDDATE在比较中,您是在比较字符串,而不是日期。在里面在您的示例中,这意味着
    '28…'>'24…'

    你也应该

    • 更改数据库设计以将日期存储为
      DATETIME
      值,或
    顺便说一下,包括工作日在内,不需要检查日期范围,因此我建议删除它以避免错误。事实上,您的示例中似乎有一个错误:在您的问题中,星期二应该是星期三。

    试试这个

    select * from FILES where RECORDDATE between STR_TO_DATE('11 January 2015 Saturday',"%d %M %Y %W") and STR_TO_DATE('24 October 2015 Monday',"%d %M %Y %W")
    

    希望你能修复你的数据。。。但根据您的示例日期,这里有一个CTE,它将修复您的日期并格式化您的数据,以便对其进行过滤

    WITH [SubDates] AS (
        SELECT 
            [FILES].*
            ,SUBSTRING([FILES].[RECORDDATE], 0, PATINDEX('%20[0-9][0-9] %', [FILES].[RECORDDATE]) + 4) AS [RECORDDATE_Sub]
        FROM [FILES]
    ), [AsDates] AS (
        SELECT 
            [SubDates].*
            ,CASE ISDATE([SubDates].[RECORDDATE_Sub])
                WHEN 1 THEN CONVERT(DATE, [SubDates].[RECORDDATE_Sub])
                END AS [RECORDDATE_Fixed]
        FROM [SubDates]
    )
    SELECT * 
    FROM [AsDates] 
    WHERE 
        [AsDates].[RECORDDATE_Fixed] BETWEEN '11 January 2015' AND '24 October 2015'
    


    决不能将
    DateTime
    值存储为字符。你有。1月28日之后可能没有数据@seoduYeah。。这会很有趣的。但这是可能的。对不起,如果你甚至没有想法,那么事情看起来就不好了:(@Seodu我真的很想看到你的应用程序在我的德国Windows上运行…:-DYou可以用持久化的计算列修复数据,但我觉得日期的格式像他自己的一样,有很多
    SELECT*
    查询需要处理。当然,我总是假设日期/时间是使用适当的类型存储在数据库中的.如果不是这样的话…好吧…这就是你得到的。我的天啊…我刚刚看到他实际上将日期存储为
    nvarchar
    。似乎我以前没有正确阅读这个问题。哦,好吧…是的…我想这会很容易,不是吗:)我觉得有点惭愧,我读到这个问题,好像他在数据库里有正确的数据,然后想和这个日期字符串作比较。我一直想知道人们是怎么考虑这样一个精心设计的(甚至有用的)。数据模型…他说sql server在MSSQL中不是MySQL。那么你应该在MS-sql中搜索日期格式转换。你来这里是为了回答这个问题,而不是告诉他搜索。为不同的DBMS提供解决方案会让OP更加困惑。如果这么简单(只需一个谷歌),是什么阻止你在这里提供答案,而不是写一些误导性的东西,然后告诉他自己用谷歌搜索正确的解决方案?哈哈……我们不是想挑起争端,只是要指出,建议某人使用他们平台上不存在的功能无助于消除他们的困惑。你的答案是正确的但也有其他答案是正确的,所以我不知道如何将所有答案标记为答案:)谢谢。你的答案是正确的,但其他答案也是正确的,所以我不知道如何将所有答案标记为答案:)谢谢。@Seodu很遗憾你不能这样做,但你可以投票给他们:-)请,为了你自己的理智,更改你的数据模型。我现在正在更改@ThorstenDittmar:)你的答案是正确的,但其他答案也是正确的,所以我不知道如何将所有答案标记为答案:)谢谢。@Seodu,通常如果答案同样有用,那么选择最老的答案。如果某个特定的答案更有用,那么选择该答案。