1

我有以下数据:

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

那么为什么我会遇到这个问题,我该如何解决呢?

4

2 回答 2

1

您正在为日期字符串使用 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)
于 2013-10-09T22:05:48.063 回答
1

如果您使用 MS Access 运行查询,则需要用#符号分隔日期,即:#12/31/2008#。如果由于某种原因这不起作用,最好使用'yyyy-mm-dd'格式中的字符串日期,因为它将被识别并且是明确的。

你可能会遇到这个问题,因为 MS 是一家美国公司,而美国使用 mm/dd/yyyy 格式,所以 MS 已经默认他们的大部分旧软件尽可能将日期视为这种格式,而你可能在一个使用 - 并且将您的 PC 的位置设置为使用 - dd/mm/yyy 格式的国家/地区。由于并非所有 MS 的软件都遵循此规则,因此您会遇到此问题。

解决方案是使用明确的字符串日期格式,例如:yyyy-mm-dd、、mmm/dd/yyyydd/mmm/yyyy(其中 mmm 返回三个字母的月份,例如Dec)。

于 2013-10-09T22:00:04.337 回答