日期时间解释问题
,我有以下数据:日期时间解释问题
StartDate FinishDate Details
09/10/2013 11/10/2013 xxx
14/10/2013 13/10/2014 Taking a year off
虽然编辑这个数据我该检查的日期范围不重叠。
我正在通过ado来访问SQL查询来执行此操作;我将输入日期输入数据库格式(即'mm/dd/yyyy');这是我得到的查询:
SELECT Count(*)
FROM MarkerAbsence
WHERE PerID = 718 AND
('10/09/2013' BETWEEN StartDate AND FinishDate OR
'10/11/2013' BETWEEN StartDate AND FinishDate)
如果数据是有效的,它应该返回零记录;但它不返回1(是上面列出的第二个记录),因此似乎将“10/11/2013”解释为dd/mm/yyyy而不是mm/dd/yyyy。
然而,如果我这样做是SMO:
DECLARE @datevar datetime2 = '31/12/2008';
SELECT @datevar;
我得到:
Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.
虽然
DECLARE @datevar datetime2 = '12/31/2008';
SELECT @datevar;
回报
2008-12-31 00:00:00.0000000
那么,为什么我有这个问题,我该如何解决它?
如果您使用MS Access运行查询,则需要使用#
符号来划分日期,即:#12/31/2008#。如果因为任何原因无法使用,最好使用'yyyy-mm-dd'
格式的字符串日期,因为它会被识别并且是明确的。
由于MS是一家美国公司,而美国使用mm/dd/yyyy格式,所以您可能会遇到此问题,因此MS已经拖延了大部分较早的软件,以便尽可能将日期视为此格式,而你可能在一个国家使用 - 并且你的电脑的地区设置为使用 - dd/mm/yyy格式。由于并非所有的MS软件都遵循这个规则,所以你有这个问题。
的解决方案是使用一个字符串日期格式是明确的,如:yyyy-mm-dd
,mmm/dd/yyyy
,或dd/mmm/yyyy
(其中MMM返回一个三字母月如Dec
)。
谢谢你的回答; #s不工作,如果后端是SQL服务器,只有它是访问,但我会玩日期格式,看看会发生什么。 –
MS作为美国公司与它无关 - 访问(至少从2003年起)将使用PC的区域设置。 SQL Server应根据您在安装时选择的语言使用适当的格式。 –
'yyyy-mm-dd'确实解决了这个问题 - 非常感谢 –
对日期字符串使用dd/mm/yyyy格式。默认情况下,如果没有进行明确的转换,SQL预期日期字符串为mm/dd/yyyy或yyyy-mm-dd格式。因此,要么改变你的字符串以匹配其中一种格式,要么执行此操作:
SELECT Count(*)
FROM MarkerAbsence
WHERE PerID = 718 AND
(CONVERT(DATETIME, '10/09/2013', 103) BETWEEN StartDate AND FinishDate OR
CONVERT(DATETIME, '10/11/2013', 103) BETWEEN StartDate AND FinishDate)
什么是StartDate和FinishDate字段的数据类型?您正在使用哪种RDBMS?它是SQL Server吗? –
您确定它与第二条记录匹配,而不是第一条记录?我认为2013年9月10日会在10/09/2013和10/11/2013之间。 –