Pet*_*ter 4 sql-server-2005 datetime
我知道 SQL Server 2005 不支持DATE
,因此不可能将日期时间转换为日期。
我想要做的是在当前一周的一整天内列出所有具有日期时间的记录。
所以我需要在本周星期一创建的所有记录忽略时间戳。目前我正在使用以下内容,它确实显示了本周的周一至周五,但包括时间戳,这意味着我将根据查询的运行时间看到不同的输出:
set datefirst 1
select
DATEADD(day, 1 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as Monday,
DATEADD(day, 2 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as Tuesday,
DATEADD(day, 3 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as wednesday,
DATEADD(day, 4 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as Thursday,
DATEADD(day, 5 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as Friday
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供帮助吗?
我的预期输出将是本周每一天的一列,每周从星期一开始(即:Datefirst 1)。最终,我将在 case 语句中使用它,例如:
CASE
WHEN DateColumn >= DATEADD(day, 1 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) and DateColumn < DATEADD(day, 2 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE()))
THEN IntegerColumn
ELSE 0
END AS Monday
Run Code Online (Sandbox Code Playgroud)
...一周中的每一天都重复。我需要适应整个星期一添加的 IntegerColumn 值。如果在星期一的几个小时内没有出现 DateColumn 条目,则显示零。
今天的日期是 2016-02-11,这个查询返回2016-02-11 00:00:00.000
:
SELECT curDay = DATEADD(day, DATEDIFF(dd, 0, getdate()), 0)
Run Code Online (Sandbox Code Playgroud)
然后可以将其包含在DATEADD
语句中:
SELECT curDay = GETDATE()
, DATEADD(day, 1 - DATEPART(weekday, getdate()) + DATEDIFF(dd, 0, getdate()), 0) as Monday
, DATEADD(day, 2 - DATEPART(weekday, getdate()) + DATEDIFF(dd, 0, getdate()), 0) as Tuesday
, DATEADD(day, 3 - DATEPART(weekday, getdate()) + DATEDIFF(dd, 0, getdate()), 0) as wednesday
, DATEADD(day, 4 - DATEPART(weekday, getdate()) + DATEDIFF(dd, 0, getdate()), 0) as Thursday
, DATEADD(day, 5 - DATEPART(weekday, getdate()) + DATEDIFF(dd, 0, getdate()), 0) as Friday
Run Code Online (Sandbox Code Playgroud)
这将给出以下输出:
curDay | Monday | Tuesday | Wednesday | Thursday | Friday
2016-02-11 11:54:24.947 | 2016-02-08 00:00:00.000 | 2016-02-09 00:00:00.000 | 2016-02-10 00:00:00.000 | 2016-02-11 00:00:00.000 | 2016-02-12 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
This query returns Sunday's date (2016-02-06
this week):
SELECT Sunday = DATEADD(day, DATEDIFF(dd, 0, getdate()) - DATEPART(weekday, GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)
It can be used with this query and it gives the same output:
SELECT curDay
, DATEADD(day, 1, Sunday) as Monday
, DATEADD(day, 2, Sunday) as Tuesday
, DATEADD(day, 3, Sunday) as wednesday
, DATEADD(day, 4, Sunday) as Thursday
, DATEADD(day, 5, Sunday) as Friday
FROM (SELECT Sunday = DATEADD(day, DATEDIFF(dd, 0, getdate()) - DATEPART(weekday, GETDATE()), 0)) as cd
Run Code Online (Sandbox Code Playgroud)
For records with a date on Monday, this query can be used:
SELECT ...
FROM ...
WHERE colDate >= DATEADD(day, 1 - DATEPART(weekday, getdate()) + DATEDIFF(dd, 0, getdate()), 0)
AND colDate < DATEADD(day, 2 - DATEPART(weekday, getdate()) + DATEDIFF(dd, 0, getdate()), 0)
Run Code Online (Sandbox Code Playgroud)
It outputs rows where the date is bigger or equal to Monday at 00:00 and before Tuesday at 00:00.
It is better to use date >= '20160101 00:00' and date < '20160102 00:00'
than BETWEEN
. See: Why does my query search datetime not match?
CREATE TABLE test(id int, [date] datetime)
INSERT INTO test values(1, '2016-02-07 23:23')
INSERT INTO test values(2, '2016-02-08 01:01')
INSERT INTO test values(3, '2016-02-08 12:00')
INSERT INTO test values(4, '2016-02-08 23:23')
INSERT INTO test values(5, '2016-02-09 00:00')
DECLARE @date datetime = '2016-02-11 12:34'
set datefirst 1
-- Query 1
SELECT id, [date]
, IntegerColumn = CASE WHEN [date] >= DATEADD(day, 1 - DATEPART(weekday, @date) + DATEDIFF(dd, 0, @date), 0)
AND [date] < DATEADD(day, 2 - DATEPART(weekday, @date) + DATEDIFF(dd, 0, @date), 0)
THEN IntegerColumn
ELSE 0
END
FROM test
-- Query 2
SELECT id, [date], IntegerColumn
FROM test
WHERE [date] >= DATEADD(day, 1 - DATEPART(weekday, @date) + DATEDIFF(dd, 0, @date), 0)
AND [date] < DATEADD(day, 2 - DATEPART(weekday, @date) + DATEDIFF(dd, 0, @date), 0)
Run Code Online (Sandbox Code Playgroud)
id | date | IntegerColumn
1 | 2016-02-07 23:23:00.000 | 0
2 | 2016-02-08 01:01:00.000 | 2
3 | 2016-02-08 12:00:00.000 | 3
4 | 2016-02-08 23:23:00.000 | 4
5 | 2016-02-09 00:00:00.000 | 0
Run Code Online (Sandbox Code Playgroud)
id | date | IntegerColumn
2 | 2016-02-08 01:01:00.000 | 2
3 | 2016-02-08 12:00:00.000 | 3
4 | 2016-02-08 23:23:00.000 | 4
Run Code Online (Sandbox Code Playgroud)