2012-04-02 104 views
0

我厌倦了自己的工作,我无法理解sql datetime字段的工作方式,它真的很难理解,现在已经有2个小时了。Sql服务器日期处理问题

问题:

我有一个访问数据库,我将它移动到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如何与日期我什至不能弄清楚wheter其YYYY/MM/DD或yyyy/DD/MM。

,因为当我运行此查询:

Select * from Contractor_Appointments where app_date Between '02/04/2012' and '02/04/2012' 

应该从2/APR/2012,而不是我得到返回的所有结果:

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日期处理。 我的电脑日期设定为02/04/2012。

任何建议:

谢谢

+0

可能重复[什么正确的方式来格式日期时间在SQL服务器日期时间字段](http://stackoverflow.com/questions/1931530/what-is-the-correct-way-to-format-a-datetime-in-sql-server-datetime场) – dash 2012-04-02 21:34:20

回答

0

你有两个问题;一个是了解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如何解释此日期取决于各种设置 - 您的语言环境设置以及数据库使用的语言。在你的情况下,它实际上将它解释为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' 

this answer for more information在SQL Server查询时如何最好地格式化日期。

编辑

对于您的插入,同样适用。你需要使用一个毫不含糊的日期时间格式。看到此question for more info,但实际上:

INSERT INTO yourtable (date_column) VALUES ('20120402')会给你你想要的。

如果你有一个DateTime对象,那么调用DateTime.ToString("yyyyMMdd HH:mm:ss")会给你格式正确的字符串。

+0

相同,也可能在两个月之间我只是把这个作为一个例子:) – confusedMind 2012-04-02 21:16:06

+0

你可以请发布你正在使用的代码来执行插入?您的问题可能是您正在使用美国机器的日期时间。 – dash 2012-04-02 21:16:55

+0

两个月之间很简单 - 您将获得当前月份的第一个月,以及之后的第一个月。因此,对于所有4月份,BETWEEN条款变成:BETWEEEN'20120401 00:00:00'和'20120501 00:00:00' – dash 2012-04-02 21:18:01

0

尝试运行dbcc useroptions,看看你的Language设置为us_english和你dateformat设置为mdy

+0

事情一旦完成,我必须上传到我的主机W这是在美国吗?它只会在我的电脑上生效吗?或者这个数据库,并会在我上传的地方显示效果?我的意思是说这个命令适用于sql server或数据库 – confusedMind 2012-04-02 21:09:36

+0

,是的日期设置为mdy和languge为us_english – confusedMind 2012-04-02 21:11:19

0

为什么格式不一样?

Select * 
from Contractor_Appointments 
where app_date Between '2012-02-04' and '2012-02-04' 

要找出哪些部分是一个月

select datepart(MONTH,app_date) 
from from Contractor_Appointments 
+0

将取代/ with - help:S? – confusedMind 2012-04-02 21:12:50

+0

什么是列类型?我猜是日期时间.. – 2012-04-02 21:14:07

+0

我添加了一些内容的答案,找出哪个部分是月 – 2012-04-02 21:15:15

0

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

SELECT TOP 10 
    CONVERT(VARCHAR(26), app_date, 109), 
    * 
FROM Contractor_Appointments 

这将返回一个更清晰的日期,例如:Apr 28 2006 12:32:29:253PM

中查看转换格式此引用:中 http://www.sql-server-helper.com/tips/date-formats.aspx

+0

是的,但我有问题放在哪里条件的日期:) – confusedMind 2012-04-02 21:20:26

+0

我个人一直都有在'yyyy-MM-dd hh:mm:ss'中写入我的日期作为sql server的输入,并且从未遇到过问题。但是,如果您不确定,请将其转换为日期时间,然后将其转换回来,看看您是否获得了预期的结果。 'SELECT CONVERT(VARCHAR(26),CONVERT(DATETIME,'2012-02-04 00:00:00.000'),109)' – Khan 2012-04-02 21:25:26