2017-02-23 1 views
-1

Verwenden von SQL Server 2016. Dies ist in einem SP für einen Bericht. Bei Angabe des Datumsbereichs vom 22.02.2017 enthält der Bericht Positionen für den 21.02.2017. Datumsangaben werden in der Datenbank als DateTimeOffset gespeichert.Verwenden von Datetimeoffset-Datumsangaben im Where-Klausel-Datumsbereichsfilter

In dieser Abfrage möchte ich am 22. zurückkehren, aber ich werde auch 21..

@start und @end repräsentieren den vom Benutzer eingegebenen Datumsbereich. @storeddate ist das Datum aus der Datenbank, die zum Filtern des Berichts verwendet wurde. Mein Plan ist, das Versetzungsdatum umzuwandeln, dann den "Datum" Teil heraus zu ziehen, um zu filtern, aber es funktioniert nicht.

declare @start date = '2017-02-22'; 
declare @end date = '2017-02-22'; 
declare @storeddate datetimeoffset = '2017-02-22 00:00:19.0000000 +00:00'; 


;with dates as 
(
    select @storeddate as 'raw' 
     , @storeddate AT TIME ZONE 'Pacific Standard Time' as offset 
     , CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as dt 
     , CONVERT(datetime, @storeddate AT TIME ZONE 'Pacific Standard Time') as d 
     , CAST(CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as date) as 'casted' 
     , @start as 'start' 
     , @end as 'end' 

) 

select * from dates 
WHERE (
    CAST(CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as date) >= @start 
    AND CAST(CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as date) < DATEADD(day, 1, @end)) 

bearbeiten Notiz hinzufügen:

Seine Art einer ungeraden Szenario. Dies ist eine Intranet-Web-App, die nur in Oregon verwendet wird. Der Webentwickler verwendete eine Javascript-Datepicker-Bibliothek, die alle seine Daten in UTC änderte und er konnte nicht herausfinden, wie man sie zurücksetzte, so dass er sie einfach in der db als datetimeoffset speicherte. Jetzt muss ich alle Berichte ändern, um die richtigen Daten anzuzeigen. Die 'Zeitzone' hat die Anzeige der Daten in den Berichten korrigiert, funktioniert jedoch nicht in den where-Klauseln für die Datumsbereichsfilter.

Antwort

0

ich den Schließbügel auf der CONVERT an der falschen Stelle hatte, so war ich die @storeddate bisher Umwandlung statt der @storedate AT TIME ZONE. So ist die Antwort lautete:

WHERE CAST(CONVERT(datetime, @storeddate AT TIME ZONE 'Pacific Standard Time') as date) 

statt

WHERE CAST(CONVERT(datetime, @storeddate) AT TIME ZONE 'Pacific Standard Time' as date) 

etc ...

0

Hat das mit Ihren Zeitzonen zu tun? Sie setzen @storeddate ohne Offset ein und dann sieht es so aus, als würden Sie die Pacific-Zeit auswerten (-8: 00, nicht wahr?). Es scheint so, als würden sich die zurückgegebenen Daten verschieben.

Edit: Versuchen Sie es mit dateadd um das Datum zu ändern:

declare @start date = '2017-02-22'; 
declare @end date = '2017-02-22'; 
declare @storeddate table (rawdate datetimeoffset) 
insert into @storeddate 
values('2017-02-22 00:00:19.0000000 +00:00') 
,('2017-02-21 00:00:19.0000000 +00:00') 
,('2017-02-22 00:18:19.0000000 +00:00') 
,('2017-02-23 00:18:19.0000000 +00:00') 

;with dates as 
(
    select rawdate as 'raw' 
     , cast(dateadd(hh,-8,rawdate) as date) as offset 
     , @start as 'start' 
     , @end as 'end' 
     from @storeddate 
) 

select * from dates 
WHERE (
    offset >= @start 
and offset < DATEADD(day, 1, @end)) 
+0

Seine Art einer ungeraden Szenario. Dies ist eine Intranet-Web-App, die nur in Oregon verwendet wird. Der Webentwickler verwendete eine Javascript-Datepicker-Bibliothek, die alle seine Daten in UTC änderte und er konnte nicht herausfinden, wie man sie zurücksetzte, so dass er sie einfach in der db als datetimeoffset speicherte. Jetzt muss ich alle Berichte ändern, um die richtigen Daten anzuzeigen. Die 'Zeitzone' hat die Anzeige der Daten in den Berichten korrigiert, funktioniert jedoch nicht in den where-Klauseln für die Datumsbereichsfilter. – BattlFrog

+0

Verwenden Sie die Funktion "dateadd", um den Offset zu ermitteln, anstatt sich auf "Zeitzone" zu verlassen. Ich denke, das betrifft nur die Anzeige, nicht die Art, wie das Datum gespeichert wird. Ich versuche ein Beispiel einzufügen und habe Formatierungsprobleme. –

Verwandte Themen