假設我有一個存盤訂單 ID 和相應產品的表 - 如下所示:
Product ID | Order ID (PK) | Order Placement Date
Apple | 2455 | 2022-04-18 13:55:50.100
Apple | 2456 | 2022-04-18 15:50:40.100
Appel | 3457 | 2022-04-18 17:59:10.100
Appel | 3458 | 2022-04-18 18:40:10.100
Appel | 3459 | 2022-04-19 09:30:50.100
Appel | 3459 | 2022-04-19 14:20:20.100
我怎樣才能在昨天 18:00 CET 和當天 18:00 CET 之前的任何時間每天獲得所有可交易的產品(已下訂單)。那么當日18:00 CET之后可交易的新產品,首次上架,是否必須包含在次日選擇資料中?
也Order Placement Date將是DateTime- UTC 時區,我正在使用 SQL Server 2019。
就像是
SELECT DISTINCT Product ID, Order ID, Order Placement Date
FROM TableName
Where Order Placement Date --> From yesterday 18h until today 18:00 CET
選擇 2022-04-18 時的結果樣本:
Product ID | Order ID (PK) | Order Placement Date
Apple | 2455 | 2022-04-18 13:55:50.100
Apple | 2456 | 2022-04-18 15:50:40.100
Appel | 3457 | 2022-04-18 17:59:10.100
選擇 2022-04-19 時的結果樣本:
Product ID | Order ID (PK) | Order Placement Date
Appel | 3458 | 2022-04-18 18:40:10.100
Appel | 3459 | 2022-04-19 09:30:50.100
Appel | 3459 | 2022-04-19 14:20:20.100
uj5u.com熱心網友回復:
這有點混亂,但應該可以。我懷疑可能有一種不那么丑陋的方法,但是哦。但是,我確實假設您使用的是最新版本的 SQL Server,它支持AT TIME ZONE.
首先我們得到當前日期;我假設“今天”是從服務器的角度來看的。然后我們CONVERT到 a date(洗掉時間)然后回到 a datetime2,所以我們可以使用AT TIME ZONE,我們宣告它是中歐。SQL Server 自動處理 DST 并假定該datetime2值對于時區是正確的。然后我們將該時間更改為 UTC 并CONVERT回傳到 adatetime以便列上沒有隱式轉換。然后我們對上邊界做同樣的事情,但增加了 8 小時:
CREATE TABLE dbo.YourTable (ProductID int,
OrderID int,
OrderPlacementDate datetime); --Per question, this is UTC
INSERT INTO dbo.YourTable (ProductID,
OrderID,
OrderPlacementDate)
VALUES(2,2,'20220418 21:48:59.123'), --Would be 2022-04-18 23:48:59.123 CEST
(1,1,'20220418 22:15:17.167'), --Would be 2022-04-19 00:15:17.167 CEST
(1,1,'20220419 15:15:17.167'), --Would be 2022-04-19 17:15:17.167 CEST
(1,1,'20220419 16:15:17.167'); --Would be 2022-04-19 18:15:17.167 CEST
GO
SELECT *
FROM dbo.YourTable
WHERE OrderPlacementDate >= CONVERT(datetime,(CONVERT(datetime2(3),CONVERT(date,GETDATE())) AT TIME ZONE 'Central Europe Standard Time') AT TIME ZONE 'UTC')
AND OrderPlacementDate <= CONVERT(datetime,DATEADD(HOUR,18,CONVERT(datetime2(3),CONVERT(date,GETDATE())) AT TIME ZONE 'Central Europe Standard Time' AT TIME ZONE 'UTC'))
GO
DROP TABLE dbo.YourTable
db<>小提琴
uj5u.com熱心網友回復:
關于什么 :
SELECT *
FROM TableName
WHERE [Order Placement Date] < DATETIMEFROMPARTS(YEAR(GETDATE()),MONTH(GETDATE()),DAY(GETDATE()),18,0,0,0)
AND [Order Placement Date] >= DATETIMEFROMPARTS(YEAR(DATEADD(day, -1, GETDATE())),MONTH(DATEADD(day, -1, GETDATE())),DAY(DATEADD(day, -1, GETDATE())),18,0,0,0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/459826.html
下一篇:將帶小數的字串串列轉換為日期時間
