0

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

问题:

我有一个访问数据库,我将它移动到 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' 

它应该返回 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 。

任何建议:

谢谢

4

4 回答 4

0

尝试运行dbcc useroptions以查看您Language是否设置为us_english并且您dateformat的设置为mdy

于 2012-04-02T21:06:17.977 回答
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 
于 2012-04-02T21:06:58.693 回答
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'

有关在 SQL Server 中查询时如何最好地格式化日期的更多信息,请参阅此答案。

编辑

对于您的插入,同样适用。您需要使用明确的日期时间格式。有关更多信息,请参阅此问题,但有效:

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

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

于 2012-04-02T21:07:53.670 回答
0

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

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

于 2012-04-02T21:14:27.973 回答