Asp.net Sql server日期处理问题

Asp.net Sql server日期处理问题,asp.net,visual-studio-2010,sql-server-2008-r2,sqldatetime,Asp.net,Visual Studio 2010,Sql Server 2008 R2,Sqldatetime,我已经厌倦了自己解决这个问题,我无法理解sql datetime字段的工作方式它真的很难理解,现在已经2个小时了 问题: 我有一个access数据库,并将其移动到sql server 2008 r2表(全部导入) 现在我在sql表中有了日期,比如 2012-04-03 00:00:00.000 2012-04-04 00:00:00.000 2012-04-05 00:00:00.000 2012-04-04 00:00:00.000 2012-04-05 00:00:00.000 2012-0

我已经厌倦了自己解决这个问题,我无法理解sql datetime字段的工作方式它真的很难理解,现在已经2个小时了

问题:

我有一个access数据库,并将其移动到sql server 2008 r2表(全部导入)

现在我在sql表中有了日期,比如

2012-04-03 00:00:00.000
2012-04-04 00:00:00.000
2012-04-05 00:00:00.000
2012-04-04 00:00:00.000
2012-04-05 00:00:00.000
2012-04-09 00:00:00.000
2012-04-09 00:00:00.000
这个sql是如何与日期一起工作的,我甚至不知道它是yyyy/mm/dd还是yyyy/dd/mm

因为当我运行此查询时:

Select * from Contractor_Appointments where app_date  Between '02/04/2012' and '02/04/2012' 
它应该返回2012年4月2日的所有结果,而不是我得到的结果:

2012-02-04 00:00:00.000
2012-02-04 00:00:00.000
2012-02-04 00:00:00.000
2012-02-04 00:00:00.000
当我在数据库中插入一条新记录时,日期为:

2012-02-04 00:00:00.000
然后显示在上面的查询中:(请帮助我,我已经厌倦了这种sql日期处理。 我的计算机日期设置为2012年4月2日

任何建议:


谢谢

尝试运行
dbcc用户选项
,查看您的
语言
是否设置为
us\u english
,您的
日期格式
是否设置为
mdy

为什么格式不相同

Select * 
from Contractor_Appointments 
where app_date  Between '2012-02-04' and '2012-02-04'
看看这个月是哪一部分

select datepart(MONTH,app_date)
from from Contractor_Appointments 

您有两个问题;一个是理解SQL Server如何处理日期。在上面的示例中,您的查询实际上是:

SELECT * from Contractor_Appointments where app_date  Between '02/04/2012 00:00:00' and '02/04/2012 00:00:00'
您要求在午夜和午夜之间进行所有约会,这并不糟糕,但第二个问题除外。您使用的日期-时间格式不明确。SQL Server如何解释此日期将取决于各种设置—例如您的区域设置和数据库使用的语言。在您的情况下,实际上是i将其解释为2012年2月4日,这表明您正在美国计算机上运行查询,或者您的数据库语言是针对日期格式为MM/dd/yyyy的地区

改用固定日期时间格式-这是明确的,应该独立于区域设置。固定日期时间格式的一个示例是yyyyMMdd HH:mm:ss

因此,您的查询变成:

SELECT * from Contractor_Appointments where app_date  Between '20120402 00:00:00' and '20120403 00:00:00'
这将为您提供2012年4月2日的所有预约(即4月2日午夜至4月3日午夜之间的所有预约)

如果您的日期时间看起来都是午夜,您也可以这样轻松地编写查询:

SELECT * FROM Contractor_Appointments WHERE app_date = '20120402 00:00:00'
有关在SQL Server中查询时如何最好地格式化日期的信息,请参见

编辑

对于插入,同样适用。您需要使用明确的日期时间格式。请参见以下内容,但实际上:

将值('20120402')插入表格(日期列)
将为您提供所需内容


如果您有一个DateTime对象,则调用
DateTime.ToString(“yyyyMMdd HH:mm:ss”)
将为您提供格式正确的字符串。

要了解日期存储的格式,请尝试将其转换为更清晰的格式。使用SQL Server
CONVERT
函数:

SELECT TOP 10 
    CONVERT(VARCHAR(26), app_date, 109),
    *
FROM Contractor_Appointments
这将返回一个更清晰的日期,例如:
Apr28200612:32:29:253PM

有关更多转换格式,请参见此参考:

事情一旦在这里完成,我就必须将其上传到我在美国的主机上?它是否只在我的电脑上生效?或此数据库,并将在我上传它的任何地方显示效果?我的意思是说此命令在sql server或数据库上工作,是的,日期设置为mdy,语言设置为us。\u English将替换/使用-help:S?我添加了S我对答案很满意,为了找出monthI所做的是哪一部分,因此从access导入的部分是正确的=第4个月,但我输入的部分=2您在这里发现了非常好的选项(我认为最好的选项是具有固定日期的选项)。您是否尝试将02/04/切换到04/02/?这也会起作用。我的答案中的一个也会起作用。您必须尝试。还有一个问题,为什么2012年4月2日星期一在我插入sql时出错,其中column type-datetime日期也可以介于两个月之间?我只是举个例子:)你可以发布你用来执行插入的代码吗?您的问题可能是您使用的是美国机器上的日期时间。两个月之间很简单-您取当前月份的第一个月,然后取下下下个月的第一个月。因此,对于整个四月份,中间条款变为:介于“20120401 00:00:00”和“20120501 00:00:00”之间是的,但我在将where条件设置为日期时遇到了问题:)我个人一直将日期写在
yyyy-MM-dd hh:MM:ss
中作为sql server的输入,从未遇到过问题。但如果您不确定,请将其转换为datetime,然后再转换回来,看看是否得到预期的结果<代码>选择转换(VARCHAR(26),转换(DATETIME,'2012-02-04 00:00:00.000'),109)
可能重复的